从nsdata objective-c iOS获取浮点值

时间:2013-08-26 05:59:15

标签: objective-c nsdata

我试图从包含几个十六进制值的NSData对象中获取一个浮点值。例如EC 51 38 41 从这4个字节值我想得到浮点值11.52。我如何在xcode中执行此操作?

我已经使用NSScanner(scanFloat,scanHexFloat),NSNumberformatterNSNumber进行了尝试,我创建了一个字节数组并尝试了float myFloat = *(float*)&myByteArray。我在stackoverflow找到了所有这些选项。

我在Windows中使用C#进行了测试,没有问题:

byte[] bytes = new byte[4] { 0xEC, 0x51, 0x38, 0x41 };

float myFloat = System.BitConverter.ToSingle(bytes, 0);

有人知道我在xcode中怎么做吗???

谢谢,本杰明

3 个答案:

答案 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用于扫描字符串。 NSNumberNSData不同,NSNumberFormatter也无法与NSData一起使用。

NSData是普通旧二进制数据的容器。你显然已经在float个实例中存储了NSData;如果你想访问它,你需要得到数据bytes,然后根据你喜欢的方式解释这些字节,例如:通过转换为float

float *p = (float*)[myData bytes];   // -bytes returns a void* that points to the data
float f = *p;