如何连接两个整数变量以形成长变量



我有一个长类型变量,应该保存到字节缓冲区。由于在 Java 中所有 int 值都适合 4 个字节,所有长值都存储在 8 个字节中,并且我可以使用一个简单的功能,将整数保存为 4 个字节,因此我想出了这个解决方案:

public class TestApp {
    static byte [] buffer = new byte[8];
    static public void writeInt(int startIndex, int number) {
        buffer[startIndex]     = (byte) (number >> 24);
        buffer[startIndex + 1] = (byte) (number >> 16 & 0x000000FF);
        buffer[startIndex + 2] = (byte) (number >>  8 & 0x000000FF);
        buffer[startIndex + 3] = (byte) (number & 0x000000FF);
    }
    static public int readInt(int startIndex) {
        return
            (buffer[startIndex] & 0xFF) << 24 |
            (buffer[startIndex+1] & 0xFF) << 16 |
            (buffer[startIndex+2] & 0xFF) << 8 |
            (buffer[startIndex+3] & 0xFF);
    }
    static public void writeLong(int startIndex, long number) {
        writeInt(startIndex, (int)(number >> 32));
        writeInt(startIndex + 4, (int)number);
    }
    static public long readLong(int startIndex) {
        long a1 = readInt(startIndex);
        long a2 = readInt(startIndex+4);
        long b= a1 << 32;
        b |= a2;
        return b;
    }
    public static void main(String []args) {
        long r = 817859255185602L;
        writeLong(0, r);
        long test = readLong(0);
        System.out.println(Long.toString(r));
        System.out.println(Long.toString(test));
    }
}
令人

惊讶的是,readLong()实际上没有做它应该做的事情。我在编写readLong()writeLong()时的想法是,将一个整数值向左移动 32 位,并将结果与下一个整数一起移动;结果将成为所需的多头值。但这个样本证明我错了。两个整数有什么问题?

你的问题出在这一部分:

long a1 = readInt(startIndex);
long a2 = readInt(startIndex+4);

readInt返回一个int。这会自动转换为长整型。转换为 long 不仅仅是添加四个字节的零。它将符号位向左延伸。

在这种情况下,a2 0xb261b0c2.这意味着它的最高有效位 - 符号位 - 是 1。所以它被扩展到长0xffffffffb261b0c2.

当然,当您或带有移位a1时,结果将始终是0xffffffff________

你应该做的是

long a2 = readInt(startIndex+4) & 0xffffffffL;

这将确保a2中最重要的四个字节将保持零,因此当您使用移位a1或它们时是中性的。

RealSkeptic的答案是正确的。不过,在我看来,您正在尝试重新发明轮子。例如,番石榴已经在多头/整数/...和字节数组:

    long r = 817859255185602L;
    byte[] buffer = Longs.toByteArray(r);
    long test = Longs.fromByteArray(buffer);

最新更新