ByteBuffer.get() 与 InputStream.read()

版权声明:转载请注明出处 https://blog.csdn.net/qiaojialin/article/details/84572432

在使用 ByteBuffer 替换 InputStream 时,遇到了一个问题,就是 InputStream 的 read 方法与 ByteBuffer 的 get 方法是不一样的,在遇到小于 0 的 byte 就会出错。

InputStream 的 read() 方法读取一个 byte,返回一个无符号数,范围 0~255

	/**
     * Reads the next byte of data from the input stream. The value byte is
     * returned as an <code>int</code> in the range <code>0</code> to
     * <code>255</code>. If no byte is available because the end of the stream
     * has been reached, the value <code>-1</code> is returned. 
     */
    public abstract int read() throws IOException;


ByteBuffer 的 get() 方法读取一个 byte,返回一个有符号数,范围 -128-127

 /**
     * Relative <i>get</i> method.  Reads the byte at this buffer's
     * current position, and then increments the position.
     *
     * @return  The byte at the buffer's current position
     *
     * @throws  BufferUnderflowException
     *          If the buffer's current position is not smaller than its limit
     */
    public abstract byte get();


byte 的范围是 -128 ~ 127。也就是 new 一个 byte 的时候只能赋值这个范围。
下面这里凡是小于 0 的 byte,两个的输出就不一样

		byte[] bytes = new byte[1];
		bytes[0] = 127;
        ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
        int a = inputStream.read();
        System.out.println(a);

        ByteBuffer buffer = ByteBuffer.wrap(bytes);
        int b = buffer.get();
        System.out.println(b);


因为 InputStream 在读的时候与了一个 0xFF,下面是 ByteArrayInputStream 的:

public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
    }
    

而 ByteBuffer 在读的时候并没有 与 0xFF。可以将 ByteBuffer 的 get 得到的数字 & 0xFF,来得到 InputStream 的 read 的效果:

以 byte = -13 为例,InputStream 的 read 返回 243,ByteBuffer 的 get 返回 -13。下面就是这个返回的 int 的各个 bit

243: 0000000011110011
-13: 1111111111110011
0xFF:0000000011111111
-13 & 0 xFF: 0000000011110011

猜你喜欢

转载自blog.csdn.net/qiaojialin/article/details/84572432