2016-09-07 100 views
1

我想要一个小端的DWORD字节数组的无符号值。将DWORD字节数组转换为无符号长数

这是我写的:

private long getUnsignedInt(byte[] data) { 
     long result = 0; 
     for (int i = 0; i < data.length; i++) { 
      result += (data[i] & 0xFF) << 8 * (data.length - 1 - i); 
     } 
     return result; 
} 

是不是?

+0

它给你你期望的值吗? – Kayaman

+0

对于我所测试的是,但我不明白这是否是“二补”安全。 – Tobia

+0

尼斯downvoter,也许我不应该发布的代码,但只有问题? – Tobia

回答

2

不,我是afreaid,这是大端。

public long readUInt(byte[] data) { 
    // If you want to tackle different lengths for little endian: 
    //data = Arrays.copyOf(data, 4); 
    return ByteBuffer.wrap(data) 
     .order(ByteOrder.LITTLE_ENDIAN) 
     .getInt() & 0xFF_FF_FF_FFL; 
} 

上面做了一个4字节到(带符号)的int转换,然后使它无符号。

1

Correted为大尾端

如果DWORD你的意思是32位无符号整数,试试这个

public long readUInt(byte[] data) { 
      return (
       ((long)(data[3] & 0xFF) << 24) | 
       ((long)(data[2] & 0xFF) << 16) | 
       ((long)(data[1] & 0xFF) << 8) | 
       ((long)(data[0] & 0xFF) << 0)); 
    } 

乔普埃根的答案是正确的,我觉得这个比较快,因为没有对象分配。

+0

谢谢你,我写了一个循环,因为我想变得灵活的可变字节长度,也许我应该检查不超过长的长度。 – Tobia

+0

这是大端,而不是小端,正如Joop在[他的回答]中提到的(http://stackoverflow.com/a/39374621/5221149)。 – Andreas

+1

是的,你应该反转移位值 – Tobia

相关问题