存储我想读的Java二进制文件。我需要方法来读取无符号的8位值,无符号的16位值和无符号的32位值。什么是最好的(最快,最好看的代码)来做到这一点?我在C++中做到了这一点,做了这样的事情:转换4个字节的32位无符号整数,并在相当长的
uint8_t *buffer;
uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24;
但在Java中这将导致一个问题,如果例如缓冲[1]包含有它的符号位设置为左的结果的值shift是一个int(?)。而不是OR:在特定位置只有0xA5,或者:0xFFFFA500或类似的东西,这会“损害”两个最高字节。
我有一个代码,现在看起来像这样:
public long getUInt32() throws EOFException, IOException {
byte[] bytes = getBytes(4);
long value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
return value & 0x00000000FFFFFFFFL;
}
如果我想这四个字节×67的0xA5 0x72为0x50的结果转换为0xFFFFA567而不是0x5072A567。
编辑:这个伟大的工程:
public long getUInt32() throws EOFException, IOException {
byte[] bytes = getBytes(4);
long value = bytes[0] & 0xFF;
value |= (bytes[1] << 8) & 0xFFFF;
value |= (bytes[2] << 16) & 0xFFFFFF;
value |= (bytes[3] << 24) & 0xFFFFFFFF;
return value;
}
但是是不是有更好的办法来做到这一点? 10位操作似乎“有点”多的是这样一个简单的事情。(见我做什么呢?)=)
如果您使用的变量很长,那么ALU将始终以64位执行操作。如果该变量是int,则ALU总是在32位上进行操作(并且使ALU能力的其余32位未被使用)。对一个字节的操作最有可能使ALU的58位不被使用。这些操作总是发生在一个时钟周期内,所以说好的10位的“位”不是太多。 –
不,你的工作实施是完全正确的方法。 –
你不需要上面代码中的最后一个按位和操作:value | =(bytes [3] << 24)&0xFFFFFFFF; –