我试图从包含几个十六进制值的NSData
对象中获取一个浮点值。例如EC 51 38 41
从这4个字节值我想得到浮点值11.52。我如何在xcode中执行此操作?
我已经使用NSScanner
(scanFloat,scanHexFloat),NSNumberformatter
和NSNumber
进行了尝试,我创建了一个字节数组并尝试了float myFloat = *(float*)&myByteArray
。我在stackoverflow找到了所有这些选项。
我在Windows中使用C#进行了测试,没有问题:
byte[] bytes = new byte[4] { 0xEC, 0x51, 0x38, 0x41 };
float myFloat = System.BitConverter.ToSingle(bytes, 0);
有人知道我在xcode中怎么做吗???
谢谢,本杰明
答案 0 :(得分:5)
从外部协议转换二进制数据时,请务必确保包含正确的字节序交换:
uint32_t hostData = CFSwapInt32BigToHost(*(const uint32_t *)[data bytes]);
float value = *(float *)(&hostData);
您必须知道编码数据的字节顺序。您可能需要使用CFSwapInt32LittleToHost
代替。
答案 1 :(得分:3)
NSData * data = ...; // loaded from bluetooth
float z;
[data getBytes:&z length:sizeof(float)];
试试这个。
答案 2 :(得分:0)
我尝试过NSScanner(scanFloat,scanHexFloat),NSNumberformatter和NSNumber
你在这里咆哮着错误的树。 NSScanner
用于扫描字符串。 NSNumber
与NSData
不同,NSNumberFormatter
也无法与NSData
一起使用。
NSData
是普通旧二进制数据的容器。你显然已经在float
个实例中存储了NSData
;如果你想访问它,你需要得到数据bytes
,然后根据你喜欢的方式解释这些字节,例如:通过转换为float
:
float *p = (float*)[myData bytes]; // -bytes returns a void* that points to the data
float f = *p;