Xcode 在Swift中将-Hex-NSData格式中的4个字节正确读入其正确的数据类型(float或int)
我会尽可能地说清楚的。我事先感谢所有的帮助 我正在尝试编写一个iOS 8应用程序,该应用程序使用用于Swift的CoreBluetooth框架。我知道如何在Swift中启动和获取值,并订阅我想要的Bluetooth BLE外围设备的值,这不会成为问题。然而,我确实需要帮助来理解和正确地将我收到的价值观转化为我可以正确使用的价值观 我正在使用一个BLE外设以浮点形式发送模拟数据。检查characteristics.value.length属性我知道我收到了4个十六进制字节。同样使用LightBlue应用程序,我也了解到接收信息的格式是一个4字节的小尾端浮点 我从输出窗口接收的值示例如下:Xcode 在Swift中将-Hex-NSData格式中的4个字节正确读入其正确的数据类型(float或int),xcode,swift,ios8,hex,nsdata,Xcode,Swift,Ios8,Hex,Nsdata,我会尽可能地说清楚的。我事先感谢所有的帮助 我正在尝试编写一个iOS 8应用程序,该应用程序使用用于Swift的CoreBluetooth框架。我知道如何在Swift中启动和获取值,并订阅我想要的Bluetooth BLE外围设备的值,这不会成为问题。然而,我确实需要帮助来理解和正确地将我收到的价值观转化为我可以正确使用的价值观 我正在使用一个BLE外设以浮点形式发送模拟数据。检查characteristics.value.length属性我知道我收到了4个十六进制字节。同样使用LightBlu
float dataFloat(NSData *data)
{
uint8_t *p = (uint8_t*)[data bytes];
NSUInteger len = [data length];
return (sizeof(float) <= len ? *(float*)p : 0);
}
不过,我不想将此信息转换为字符串,因为稍后我将尝试对这些值进行一些处理(一旦它们转换为我知道并熟悉的值),但现在我希望显示输出窗口,而不是0x00C07F44十六进制,例如1023
我也要感谢大家花时间阅读我的问题,虽然它可能看起来与其他人的相似。。。我已经尝试过他们的解决方案,但他们似乎不适合我,我承认我对这一点很陌生,所以我道歉,并希望您考虑
请让我知道,如果有任何其他信息,我可以提供,我可能错过了
真诚地
Maverik0106经过一段时间的研究和社区民意调查,我从位于的一位社区成员那里找到了答案:这要归功于他 正确地将数据转换为UInt32然后转换为浮点的代码如下:
var test:UInt32 = 0
data.getBytes(&test, length: sizeof(NSInteger))
var floatVal:Float = unsafeBitCast(reversed, Float.self)
println(floatVal)
假设您将“data”变量作为NSData
但是,如果您有类似的问题,但需要在将字节转换为浮动之前翻转字节,则代码将更改为:
var test:UInt32 = 0
data.getBytes(&test, length: sizeof(NSInteger))
var reversed = test.byteSwapped
var floatVal:Float = unsafeBitCast(reversed, Float.self)
println(floatVal)
此解决方案同时考虑了端性和端性。非常感谢Bill提供此解决方案
更小/更好的解决方案是:
var floatVal:Float = 0.0;
data.getBytes(&floatVal, length:sizeof(Float))
println(floatVal)
这个不会翻转位tho,因此,如果它不需要交换字节,那么这将是更安全/更好的方法。经过一段时间的研究和社区投票,我从一位社区成员那里找到了答案:这要归功于他 正确地将数据转换为UInt32然后转换为浮点的代码如下:
var test:UInt32 = 0
data.getBytes(&test, length: sizeof(NSInteger))
var floatVal:Float = unsafeBitCast(reversed, Float.self)
println(floatVal)
假设您将“data”变量作为NSData
但是,如果您有类似的问题,但需要在将字节转换为浮动之前翻转字节,则代码将更改为:
var test:UInt32 = 0
data.getBytes(&test, length: sizeof(NSInteger))
var reversed = test.byteSwapped
var floatVal:Float = unsafeBitCast(reversed, Float.self)
println(floatVal)
此解决方案同时考虑了端性和端性。非常感谢Bill提供此解决方案
更小/更好的解决方案是:
var floatVal:Float = 0.0;
data.getBytes(&floatVal, length:sizeof(Float))
println(floatVal)
这个不会翻转位tho,因此如果它不需要交换字节,那么这将是更安全/更好的路线。在这个问题中,请看
fromByteArray
:在这个问题中,请看fromByteArray
: