Java 将4个字节转换为无符号32位整数,并将其存储在长
我正在尝试用Java读取一个二进制文件。我需要读取无符号8位值、无符号16位值和无符号32位值的方法。做这件事最好的方法是什么(最快、最好看的代码)?我已经在C++中做过这样的事情:Java 将4个字节转换为无符号32位整数,并将其存储在长,java,bit-manipulation,Java,Bit Manipulation,我正在尝试用Java读取一个二进制文件。我需要读取无符号8位值、无符号16位值和无符号32位值的方法。做这件事最好的方法是什么(最快、最好看的代码)?我已经在C++中做过这样的事情: uint8_t *buffer; uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24; public long getUInt32() throws EOFExcepti
uint8_t *buffer;
uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24;
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;
}
uint8_t*缓冲区;
uint32_t value=buffer[0]| buffer[1]你的想法是对的,我认为没有任何明显的改进。如果你看一下,他们有相同的代码。它们切换的顺序。更常规的版本首先将字节转换为整数形式的无符号值:
public long getUInt32() throws EOFException, IOException {
byte[] bytes = getBytes(4);
long value =
((bytes[0] & 0xFF) << 0) |
((bytes[1] & 0xFF) << 8) |
((bytes[2] & 0xFF) << 16) |
((long) (bytes[3] & 0xFF) << 24);
return value;
}
public long getUInt32()抛出EOFEException,IOException{
byte[]bytes=getBytes(4);
长值=
((字节[0]&0xFF)如果使用的变量很长,则ALU将始终在64位上执行操作。如果变量为int,则ALU始终在32位上执行操作(并保留ALU功能的其他32位未使用)。对一个字节的操作很可能会使ALU的58位未使用。这些操作总是在一个时钟周期内进行,因此没有一句好话说10位太多。不,您的工作实现正是正确的方法。您不需要上面代码中的最后一个按位and操作:value |=(字节[3]需要使用((长)(字节[+3]&0xFF)
DataInputStream d = new DataInputStream(new FileInputStream("myfile"));
d.readInt();
public long getUInt32() throws EOFException, IOException {
byte[] bytes = getBytes(4);
long value =
((bytes[0] & 0xFF) << 0) |
((bytes[1] & 0xFF) << 8) |
((bytes[2] & 0xFF) << 16) |
((long) (bytes[3] & 0xFF) << 24);
return value;
}