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

Java 如何在Objective-C中将字节数组转换为UInt64,java,objective-c,byte,uint64,Java,Objective C,Byte,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

到目前为止,我已经将收到的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;
}
+(UInt64)convertbytearrayout64:(无符号字符*)字节的长度:(NSInteger)长度
{
UInt64数据=0;
for(int i=0;i
我收到的8字节数据是:

01003b

我的方法的输出是:

16777216

我尝试使用计算器将“16777216”转换为字节,得到:

01 00 00

这意味着3b不包括在转换中

但是,我在java下尝试了这段代码,效果很好。我不知道问题出在哪里


请帮助。提前感谢!

一个
UInt64
是8个字节,所以如果你有一个8字节的缓冲区,你所需要做的就是做一个
UInt64
指针指向它并取消引用它(只要数据在x86架构上是小端格式的,但我马上就会谈到)

因此:

请注意,尽管x86硬件上的各个字节值都是小端字节,但最低有效字节在缓冲区中排在第一位。因此,如果您将上面的缓冲区视为单个基16位,则数字将为:

0x0102030405060708(最高有效字节是缓冲区中的最后一个字节)

不过,您要寻找的技巧是简单地将8字节缓冲区强制转换为
UInt64*
,然后取消对它的引用。如果您从未见过big-vs.-little-endian存储/字节顺序,我建议您先阅读一下


p、 s.-顺便说一句,发送方代码是错误的,数组索引(
i
)需要从0运行到7,因此
(i=0;iA
UInt64
是8个字节,因此如果您有一个8字节的缓冲区,您所需要做的就是创建一个指向它的
UInt64
指针并取消引用它(只要数据在x86体系结构上是little endian格式,但我马上就会谈到这一点)

因此:

请注意,尽管x86硬件上的各个字节值都是小端字节,但最低有效字节在缓冲区中排在第一位。因此,如果您将上面的缓冲区视为单个基16位,则数字将为:

0x0102030405060708(最高有效字节是缓冲区中的最后一个字节)

不过,您要寻找的技巧是简单地将8字节缓冲区强制转换为
UInt64*
,然后取消对它的引用。如果您从未见过big-vs.-little-endian存储/字节顺序,我建议您先阅读一下

p、 顺便说一句,发送方代码错误,数组索引(
i
)需要从0运行到7,因此
(i=0;i
for(int i=1;i<9;i++)
{
    statusdata[i] = (time >> 8*i & 0xff);
}
unsigned char foo[8] = {0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01};

UInt64 *n = (UInt64 *) foo;  // pointer to value 0x0102030405060708

UInt64 nValue = *n;
data = 0

for (i=0; i < 8; ++i) {
    data = (data << 8) | bytes[i];  // bytes is already UInt8 * so no need to mask it
}