2016-05-14 10 views
3

バイトバッファに保存する必要があるlong型の変数があります。2つの整数変数を連結して長い変数を構成する方法

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

:Javaですべてのint値が4バイトに適合していると、すべてのlong値を8バイトに格納されている、と私は4バイトの整数を節約する簡単な機能へのアクセスを持っているので、私はこの解決策を考え出しましたreadLong()が実際にやるべきことをしていないことがわかりました。私がreadLong()writeLong()を書くときに思ったのは、1つの整数値を左に32ビットシフトし、次の整数で結果をoringするときでした。その結果は望ましい長い値になります。しかし、このサンプルは私が間違っていることを証明した。 2つの整数の間違いは何ですか?

答えて

5

あなたの問題は、この部分にある:

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

intを返しreadInt。これは自動的にロングに変換されます。 longへの変換は単に4バイトのゼロを追加するだけではありません。符号ビットを左に伸ばします。

この場合、a20xb261b0c2であった。これは、その最上位ビット(符号ビット)が1であることを意味します。したがって、それは長い0xffffffffb261b0c2に拡張されました。

もちろん、シフトしたものをa1とすると、結果は常に0xffffffff________になります。あなたは何をすべき

これはa2の上位4つのバイトがゼロのまま、ひいてはときたりずらしa1で中立になることが保証されます

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

です。

+0

符号ビットの説明をありがとうございます。私はその意義を無視していた。 – Klaus

0

RealStepticの回答は正しいです。しかし、私はあなたが車輪を再発明しようとしているようです。例えば。 Guavaはすでにlong/int/...とバイト配列の変換を行っています。

long r = 817859255185602L; 
    byte[] buffer = Longs.toByteArray(r); 
    long test = Longs.fromByteArray(buffer); 
関連する問題