2

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

我已经尝试过NSScanner(scanFloat,scanHexFloat),NSNumberformatter并且NSNumber,我创建了一个字节数组并尝试了float myFloat = *(float*)&myByteArray。我在 stackoverflow 找到的所有这些选项。

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

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

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

有人知道我必须如何在 xcode 中执行此操作吗???

谢谢,本杰明

4

3 回答 3

5

从外部协议转换二进制数据时,请始终确保包括正确的字节顺序交换:

uint32_t hostData = CFSwapInt32BigToHost(*(const uint32_t *)[data bytes]);
float value = *(float *)(&hostData);

您必须知道编码数据的字节顺序。您可能需要CFSwapInt32LittleToHost改用。

于 2013-08-26T16:26:27.827 回答
3
NSData * data = ...; // loaded from bluetooth
float z;
[data getBytes:&z length:sizeof(float)];

尝试这个。

于 2013-08-26T06:06:05.427 回答
0

我用 NSScanner (scanFloat, scanHexFloat), NSNumberformatter 和 NSNumber 尝试过

你在这里叫错树了。NSScanner用于扫描字符串。NSNumber与 不同NSDataNSNumberFormatter也不能与任何一个一起NSData使用。

NSData是普通旧二进制数据的容器。您显然已将 afloat存储在NSData实例中;如果您想访问它,您需要获取数据bytes,然后根据您的喜好解释这些字节,例如通过转换为float

float *p = (float*)[myData bytes];   // -bytes returns a void* that points to the data
float f = *p;
于 2013-08-26T06:06:18.697 回答