如何在ObjectiveC中将字节数组转换为浮点值?

时间:2018-01-19 15:54:30

标签: objective-c

我有长字节数字

Byte *GolfResult = (Byte*)calloc(40, sizeof(Byte));

那些字节是十六进制值。

对于每四个字节我喜欢转换为浮点数。 我所做的是,制作一个四字节数组和

unsigned char *fourbytearray = (unsigned char *)calloc(4, sizeof(unsigned char));

然后将每四个字节复制到此四字节。

fourbytearray[3] = GolfResult[0]; fourbytearray[2] = GolfResult[1]; fourbytearray[1] = GolfResult[2]; fourbytearray[0] = GolfResult[3];

然后转换为float。

float result = [[NSNumber numberWithUnsignedChar:*bytearray] floatValue];

浪费时间,结果不正确。

例如,我有四个字节为0x4148e7e1。如果我将此十六进制值转换为此converter中的浮点数,我的结果正确为12.5666。

但如果我转换为[[NSNumber numberWithUnsignedChar:*bytearray],则结果为65.这是错误的。

那么将Byte数组转换为每四个字节的浮点值的最佳方法是什么。

2 个答案:

答案 0 :(得分:0)

numberWithUnsignedChar方法只转换一个字节,即第一个字节。这就是为什么你得到的65等于你的第一个字节0x41

这是因为*bytearraybytearray[0]相同;只是数组的第一个元素。阅读this section of the C-FAQ可能会有所帮助。

作为LGP says,一旦你的字节排列正确并确保浮点格式匹配,你需要做的就是投射。

答案 1 :(得分:0)

我同意意义问题。您的字节顺序 似乎与它应该如何存储为浮点数相反。由于您的十六进制值只是构成浮点数的位的不同表示,因此除了告诉编译器它应该将该数字视为浮点数之外,您不必做任何其他事情。一旦按正确的顺序放置了字节,这就可以了。

fourbytearray[0] = GolfResult[0]; 
fourbytearray[1] = GolfResult[1]; 
fourbytearray[2] = GolfResult[2];
fourbytearray[3] = GolfResult[3];
float result = *(float *)fourbytearray;

我尝试了你的值0x4148e7e1并获得了12.5566111。