将 DWORD 字节数组转换为无符号长整数
Convert DWORD byte array to a unsigned long number
我想要小端 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;
}
对吗?
针对 BigEndian 进行了更正
如果 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));
}
Joop Eggen 的回答是正确的,我认为这个更快,因为没有对象分配。
不,恐怕是大端。
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 的转换,然后使它成为无符号的。
我想要小端 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;
}
对吗?
针对 BigEndian 进行了更正
如果 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));
}
Joop Eggen 的回答是正确的,我认为这个更快,因为没有对象分配。
不,恐怕是大端。
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 的转换,然后使它成为无符号的。