繁体   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