Objective-C中如何将字节数组转换为UInt64



将收到的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
}

相关内容

  • 没有找到相关文章

最新更新