1

我正在开发一个非常简单的 ByteBuffer,用于 java 1.4。我有一个小骨架,基本上只是 put/getInt() put/getLong() 的实现很差。我的问题是,虽然 putInt 和 getInt 有效,但 getLong() (我认为是)不起作用。

当我读出第四个字节并将其转换为 long 时,它会溢出。但是我所有的变量都很长,所以它不应该溢出。

下面是代码(请记住,这只是一个开始):

public class ByteBuffer {

    private byte[] buffer;
    private int first = 0;
    private int last = 0;
    private int size;
    private int elements;

    public ByteBuffer(int size) {
        this.size = size;
        buffer = new byte[size];
    }

    public void putInt(int theInt) {
        for (int i = 0; i < 4; i++) {
            put((byte) (theInt >>> (8 * i)));
        }
    }

    public int getInt() {
        int theInt = 0;
        for (int i = 0; i < 4; i++) {
            theInt |= (0xFF & get()) << (8 * i);
        }
        return theInt;
    }

    public void putLong(long theLong) {
        for (int i = 0; i < 8; i++) {
            put((byte) (theLong >>> (8 * i)));
        }
    }

    public long getLong() {
        long theLong = 0L;
        for (int i = 0; i < 8; i++) {
            theLong |= (long) ((0xFF & get()) << (8 * i));
        }
        return theLong;
    }

    public void put(byte theByte) {
        buffer[last++] = theByte;
        if (last == size) {
            last = 0;
        }
        elements++;
    }

    public byte get() {
        byte theByte = buffer[first++];
        if (first == size) {
            first = 0;
        }
        elements--;
        return theByte;
    }

    public byte[] array() {
        return (byte[]) buffer.clone();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        ByteBuffer buff = new ByteBuffer(512);

        buff.putLong(9223372036854775807L);
        buff.putLong(-9223372036854775808L);

        System.out.println(9223372036854775807L);
        System.out.println(-9223372036854775808L);

        long l1 = buff.getLong();
        long l2 = buff.getLong();
        System.out.println(l1);
        System.out.println(l2);
    }

}
4

2 回答 2

6

在您的 getLong 方法中,您必须将 (0xFF & get()) 转换为 long,然后才能将其移动超过 32 位。您还可以使用长文字 (0xFFL) 代替 int 文字 (0xFF)。

原因是“int && byte”操作 (0xFF & get()) 的结果类型是 int。移位操作的规范是这样的,如果 a 是 int,“a << b”实际上将移位“b modulo 32”位,如果 a 是 long,则“b modulo 64”位。

于 2012-11-28T13:05:32.123 回答
2
theLong |= (long) ((0xFF & get()) << (8 * i));

移动一个从字节传播的 int 值,并且只能移动 32 位位置。

解决方案:

theLong |= ((long) (0xFF & get())) << (8 * i);
于 2012-11-28T13:26:31.363 回答