Java字节缓冲区getLong()溢出long变量

时间:2012-11-28 12:58:18

标签: java

我正在使用非常简单的骨头ByteBuffer与java 1.4一起使用。我有一个小骨架,基本上只有糟糕的put / getInt()put / getLong()实现。我的问题是,当putInt和getInt工作时,getLong()(我认为它)不起作用。

当我读出第四个字节并将其移入长时间溢出时。但是我所有的变量都很长,所以它不应该溢出。

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

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);
    }

}

2 个答案:

答案 0 :(得分:6)

在你的getLong方法中,你必须将(0xFF&amp; get())转换为long,然后才能将它移位超过32位。您还可以使用长文字(0xFFL)而不是int literal(0xFF)。

这样做的原因是“int&amp;&amp; byte”操作的结果类型(0xFF&amp; get())是一个int。比特移位操作的规范是这样的,如果a是int,则“a&lt;&lt; b”实际上将移位“b模32”比特,如果a是长的话,则“b模64”比特。

答案 1 :(得分:2)

theLong |= (long) ((0xFF & get()) << (8 * i));

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

解决方案:

theLong |= ((long) (0xFF & get())) << (8 * i);