在 Swift 中正确地将 -Hex- NSData 形式的 4 个字节读入其正确的数据类型(float 或 int)

Posted

技术标签:

【中文标题】在 Swift 中正确地将 -Hex- NSData 形式的 4 个字节读入其正确的数据类型(float 或 int)【英文标题】:Properly reading 4 bytes in -Hex- NSData form into its proper data type (float or int) in Swift 【发布时间】:2014-11-30 21:07:32 【问题描述】:

我会尽量表达清楚。提前感谢所有帮助!

我正在尝试为 Swift 编写一个使用 CoreBluetooth 框架的 ios 8 应用程序。我知道如何在 Swift 中从蓝牙 BLE 外围设备启动和获取值并订阅我想要的值,这不是问题。但是,我确实需要帮助来理解并将我收到的值正确转换为我可以正确使用的值。

我正在使用 BLE 外设以浮点形式发送模拟数据。检查 features.value.length 属性我知道我收到了 4 个十六进制形式的字节。同样使用 LightBlue 应用程序,我还了解到接收信息的格式是 4 字节的小端浮点数。

我从输出窗口收到的值的一个例子是:

发送的模拟值来自 0 - 1023 范围内的电位器,而 0x0000803F 十六进制给我的值是 1.0000,而 0x00C07F44 十六进制给我的值是 1023.0000(来自 LightBlue 应用程序)我真的不知道知道如何将这些值从十六进制转换为浮点数吗?

我找到了一个在 Objective-C 中执行此操作的示例应用程序,但是我是 swift 新手,并且希望仅在 swift 中执行此应用程序。执行此操作的示例应用代码如下:

float dataFloat(NSData *data)

    uint8_t *p = (uint8_t*)[data bytes];
    NSUInteger len = [data length];
    return (sizeof(float) <= len ? *(float*)p : 0);

    

调用者:

float analog = dataFloat(data);

但是,我不想将此信息转换为字符串,因为稍后我会尝试对这些值进行一些处理(一旦它们被转换为我知道并熟悉的值)但现在我会就像我的输出窗口显示而不是 0x00C07F44 十六进制,例如 1023...

我还要感谢大家花时间阅读我的问题,虽然它可能看起来与其他人的问题相似......我已经尝试了他们的解决方案,但它们似乎不适合我,我承认我对此很陌生,所以我很抱歉并希望您考虑。

如果有任何其他我可能遗漏的信息可以提供,请告诉我!

此致,

Maverik0106

【问题讨论】:

看看fromByteArray这个问题:***.com/questions/26953591/… 【参考方案1】:

经过一段时间的研究和社区民意调查,我从一位社区成员那里找到了答案:http://forum.rfduino.com/index.php?topic=727.15#msg3393 所以功劳归于他。

将数据正确转换为 UInt32 然后转换为浮点数的代码如下:

  var test:UInt32 = 0

  data.getBytes(&test, length: sizeof(NSInteger))
  var floatVal:Float = unsafeBitCast(reversed, Float.self)
  println(floatVal)

假设您将“数据”变量作为 NSData。

但是,如果您有类似的问题,但您需要在将字节转换为浮点数之前翻转字节,则代码将更改为:

  var test:UInt32 = 0          
  data.getBytes(&test, length: sizeof(NSInteger))
  var reversed = test.byteSwapped
  var floatVal:Float = unsafeBitCast(reversed, Float.self)
  println(floatVal)

此解决方案同时考虑了字节序。非常感谢比尔提供这个解决方案

一个更小/更好的解决方案是:

  var floatVal:Float = 0.0;
  data.getBytes(&floatVal, length:sizeof(Float))
  println(floatVal) 

这个不会翻转比特,所以如果它不需要交换字节,那么这将是更安全/更好的路线。

【讨论】:

以上是关于在 Swift 中正确地将 -Hex- NSData 形式的 4 个字节读入其正确的数据类型(float 或 int)的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中读取 CMSensorDataList

用于 Swift 的 NSNotFound

Swift:动态地将 JSON 添加到表单元格数组中

如何在 Swift 中最好地将对象组织成月份和年份?

Swift:如何选择性地将函数作为参数传递并调用函数?

如何正确地将url存储在数据库中?