Java 如何在Objective-C中将字节数组转换为UInt64
到目前为止,我已经将收到的8个字节转换为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
+ (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;iAUInt64
是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
}