簡體   English   中英

使用RandomAccessFile讀取無符號字節

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM