我有长字节数字
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数组转换为每四个字节的浮点值的最佳方法是什么。
答案 0 :(得分:0)
numberWithUnsignedChar
方法只转换一个字节,即第一个字节。这就是为什么你得到的65
等于你的第一个字节0x41
。
这是因为*bytearray
与bytearray[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。