【问题标题】:Data value Overflow数据值溢出
【发布时间】:2017-06-23 15:29:53
【问题描述】:

我对 Data 对象如何快速工作感到有些困惑。我正在尝试使用蓝牙写入值,我需要写入的值之一是 500。为了写入,您需要在发送之前将值转换为数据对象。这是我正在使用的代码。

if(characteristic != nil){
   var byteCount = 1
   if(sensitivity > 255){
      byteCount = 2
   }
   let data = Data.init(bytes: &sensitivity, count: byteCount)
   peripheral.writeValue(data, for: sensCharacteristic!, type: CBCharacteristicWriteType.withResponse)
   peripheral.readValue(for: sensCharacteristic!)
}else{
   print("No bluetooth Connection")
}

据我了解,如果我尝试发送一个需要超过一个字节来表示的值,那么它将溢出,因此当我发送 500 时,它写入的值实际上是 244。因此,我尝试写入和发送 2 个字节但我得到的值是 244101。我不确定这个值是从哪里来的。隐藏500的正确方法是什么?

每当读取特征然后将其放置在标签中时,都会调用此函数。它所做的只是遍历数据并将每个字节添加到字符串中。

func readCharacteristic(data: Data) -> String {
    var characterString = ""
    for byte in data {
        let c = String(byte)
        characterString.append(c)
    }
    return characterString
}

【问题讨论】:

  • 你在哪里看到244101sensitivity 是什么数据类型?您的外围设备只需要一个字节的数据,还是可以接受多个字节?
  • 就在 writeValue 之后,我有一个具有相同特征的 readValue,我将为此添加代码。 Sensitivity 只是一个 int,它的值可以是 4、13、23 ... 230、500。每个特性在此外围设备上的最大大小为 20 个字节,设备通常是否要求您一次只写入 1 个字节?
  • 大概你可以找到答案here
  • 阅读该线程,虽然可能错过了一些东西
  • 好的 - 问题几乎可以肯定是你如何转换你读回的数据......你期待一个字符串吗?

标签: ios swift bluetooth bluetooth-lowenergy


【解决方案1】:

基于此 SO 帖子:round trip Swift number types to/from Data(由 Wei Jay 指点)...

试试这个:

func readCharacteristic(data: Data) -> Int {
    return data.withUnsafeBytes { $0.pointee }
}

注意:该帖子提供了将数据转换为不同数据类型(Int、Float、Double 等)的各种方法,因此如果您知道自己只会阅读 @,则可以使用此 987654323@ 值。否则,就在这个 + 另一个帖子的基础上构建。

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 2020-05-02
    • 1970-01-01
    • 2021-02-13
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2022-01-21
    相关资源
    最近更新 更多