![](/img/trans.png)
[英]Reading specific bytes from RandomAccessFile and testing to see if they equal 0
[英]Reading unsigned bytes with RandomAccessFile
我有一個使用RandomAccessFile描述符的方法:
public byte[] readByte(int number) {
try {
byte[] buffer = new byte[number];
raf.read(buffer);
return buffer;
} catch (IOException e) {
throw new ReadException("readBytes failed", e);
}
}
我試圖用來讀取存儲一系列無符號字節的二進制文件,但是卻得到了負值。 還嘗試了:
public byte readByte() {
try {
return (byte) raf.readUnsignedByte();
} catch (IOException e) {
throw new ReadException("readByte failed", e);
}
}
public byte[] readByte(int number) {
byte[] sArray = new byte[number];
for (int i = 0; i < number; i++) {
sArray[i] = readByte();
}
return sArray;
}
在我看來,使用readUnsignedByte()應該只返回正值,但最終到處都是負值。
甚至通過以下方式強制積極:
public byte[] readByte(int number) {
byte[] sArray = new byte[number];
for (int i = 0; i < number; i++) {
sArray[i] = (byte) (readByte() & 0xFF);
}
return sArray;
}
仍然,我得到負值。 我可以使用正值的唯一方法是在使用它們時將它們轉換(我將這些數字用作另一個數組的索引):
palette[sArray[j] & 0xFF];
我究竟做錯了什么?
您將readUnsignedByte
的結果強制轉換為byte
,因此,如果結果為255(作為int
(例如),則在強制轉換為byte
后為-1
。
byte
始終使用Java簽名- 始終具有[-128, 127]
。 您對此無能為力。
我建議您堅持使用第一個代碼段(盡管使用read
的返回值來檢查您是否已實際閱讀了期望的所有內容),並在需要時使用& 0xff
獲取正值。
一種替代方法是使用short[]
,但這非常浪費-您為每1字節的實際數據使用2字節的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.