使用RandomAccessFile读取无符号字节

时间:2015-01-12 21:47:27

标签: java

我使用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];

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您正在将readUnsignedByte的结果投射到byte - 所以如果结果是int的255(例如),那么在投射到{-1之后它是byte {1}}。

byte 始终用Java签名 - 始终的范围为[-128, 127]。你无能为力。

我建议您坚持使用第一个代码段(尽管使用read的返回值来检查您是否真正阅读了预期的所有内容),然后使用& 0xff获得积极的结果在你需要它时的价值。

另一种方法是使用short[],但这非常浪费 - 你每1字节的实际数据使用2个字节的内存。