英文:
How to read byte correctly from file using Java RandomAccessFile?
问题
我有一个包含字节88(即十进制136)的二进制文件。
我正在使用Java的RandomAccessFile类和“read”方法通过预定义的缓冲区读取此字节。我还尝试过“readUnsignedByte()”,但出现了与下面相同的问题。
RandomAccessFile randomAccessFile = new RandomAccessFile(inputFile, "r");
byte[] headerBuffer = new byte[32];
randomAccessFile.read(headerBuffer);
上面的代码将88转换为-120,而不是136。
我意识到高位比特或其他设置了,但我仍然需要能够读取文件并获取88或136。
问题在于这个字节是二进制文件中的偏移量,我可以在其中找到第一个记录,因此负数行不通。
希望能得到建议。
谢谢,
英文:
I have a binary file with the byte 88 (which is 136 decimal).
I'm using Java's RandomAccessFile class and the "read" method to read this byte via a pre-defined buffer. I also tried "readUnsignedByte()" but get the same issue as below.
RandomAccessFile randomAccessFile = new RandomAccessFile(inputFile, "r");
byte[] headerBuffer = new byte[32];
randomAccessFile.read(headerBuffer);
The code above gives me -120 for 88, not 136.
I realize that the high-order bit or whatever is set, but I still need to be able to read the file and either get 88 or 136.
The issue is that this byte is the offset into the binary file where I can find the first record so a negative number won't work.
Would appreciate suggestions.
Thanks,
答案1
得分: 1
只需执行 b & 0xFF 即可将其转换为正整数。
英文:
Just do b & 0xFF to convert it to positive integer.
答案2
得分: 1
你可以使用 Byte.toUnsignedInt 方法以“无符号”的方式将一个 byte 转换为一个 int。
jshell> byte b = (byte) 0x88;
b ==> -120
jshell> Byte.toUnsignedInt(b);
$57 ==> 136
这个操作与 b & 0xff 是相同的,但不需要涉及到魔术数字或位运算的知识。
英文:
You can use the Byte.toUnsignedInt method to convert a byte into an int in an "unsigned" way.
jshell> byte b = (byte) 0x88;
b ==> -120
jshell> Byte.toUnsignedInt(b);
$57 ==> 136
The operation is the same as b & 0xff but doesn't invoke magic numbers or knowledge about bitwise operators.
答案3
得分: 0
问题:批量读取存在问题
你所使用的 read(byte[]) 方法用于一次读取多个字节,实际上读取的是一个有符号字节,就像 readByte() 那样。因此,你是对的,第一位代表了符号,在Java中可能会被解释为负数。
使用偏移量并读取无符号字节
随机访问的好处是可以使用 seek(long) 跳转到文件中的位置/偏移量。
因此,如果你知道记录指针字节的确切位置,你可以跳转到那里,并使用 readUnsignedByte() 继续读取所需的字节,作为无符号字节。
另请参阅
https://stackoverflow.com/questions/5144080/how-can-i-read-a-file-as-unsigned-bytes-in-java
英文:
Issue with bulk-read
The method read(byte[]) you use for reading multiple bytes at-once actually reads a signed byte as in readByte(). Thus you're right, the first bit represents the sign and will thus be interpreted by Java potentially leading to negative number.
Use offset and read unsigned
Benefit of random-access is to jump to the position/offset in file using seek(long).
So, if you know the exact position of that record-pointer byte, you can jump there and proceed reading the desired byte as unsigned using readUnsignedByte().
See also
https://stackoverflow.com/questions/5144080/how-can-i-read-a-file-as-unsigned-bytes-in-java
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论