将收到的8个字节转换为UInt64:
+ (UInt64)convertByteArrayToUInt64:(unsigned char *)bytes ofLength:(NSInteger)length
{
UInt64 data = 0;
for (int i = 0; i < length; i++)
{
data = data | ((UInt64) (bytes[i] & 0xff) << (24 - i * 8));
}
return data;
}
将数据转换为8字节数据的发送方这样做:
for(int i=1;i<9;i++)
{
statusdata[i] = (time >> 8*i & 0xff);
}
我收到的8字节数据数据是:
01 00 00 00 00 00 00 3b
方法的输出是:
16777216
我试图将这个"16777216"转换为字节使用计算器,我得到:
01 000 000 000 000 000 000 000
表示3b不包括在转换中。
但是,我在java下尝试了这个代码,它工作得很好。我不知道问题出在哪里。
请帮助。提前感谢!
一个UInt64
是8字节,所以如果你有一个8字节的缓冲区,你所需要做的就是让一个UInt64
指针指向它并对它解引用(只要数据在x86架构上是小端格式,但我马上就会讲到),
:
unsigned char foo[8] = {0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01};
UInt64 *n = (UInt64 *) foo; // pointer to value 0x0102030405060708
UInt64 nValue = *n;
请注意,尽管x86硬件上的单个字节值是小端序的,所以最低有效位的字节将放在缓冲区中的第一个。因此,如果您将上面的缓冲区视为单个16进制数字,则该数字将为:
0x0102030405060708(最高有效字节在缓冲区中是最后一个).
您正在寻找的技巧是简单地将8字节缓冲区转换为UInt64*
并对其解引用。如果你从未见过大v。-小端序存储/字节顺序之前我建议你去看看。
注。-发送方代码错误,顺便说一句,数组索引(i
)需要从0到7运行,因此(i=0;i<8;++i)
, 而不是 1-8或time
的值将无法正确复制。顺便说一下,发送方是试图将time
以小端顺序复制到statusdata
中(缓冲区中最低有效字节优先),但是,这再次出错了。
另外,如果发送方代码是Java的,您需要注意time
的值实际上不应该是负的。Java没有无符号整数值,所以如果time
是负数,你将它重构为UInt64,它将是一个很大的正值,这不是你想要的。
为了完整起见,我将向您展示如何从小端缓冲区逐字节地重新构造数据,但请记住,发送方代码是错误的,需要重写为从零开始的索引(如上所示的类型转换也会使您达到此目的):
data = 0
for (i=0; i < 8; ++i) {
data = (data << 8) | bytes[i]; // bytes is already UInt8 * so no need to mask it
}