2016-12-26 9 views
1

数値をバイト配列に変換してから数値に戻す必要があります。 問題は、バイト配列は、可変サイズのものであるということですので、私は彼のバイト長与えられた数を変換する必要があり、私が思いついた方法は、それらは:(Java)の数値に可変長のバイト配列

ここ
private static byte[] toArray(long value, int bytes) { 
    byte[] res = new byte[bytes]; 

    final int max = bytes*8; 
    for(int i = 1; i <= bytes; i++) 
     res[i - 1] = (byte) (value >> (max - 8 * i)); 

    return res; 
} 

private static long toLong(byte[] value) { 
    long res = 0; 

    for (byte b : value) 
     res = (res << 8) | (b & 0xff); 

    return res; 
} 

私は長いを使用8は使用できる最大バイト数であるためです。 この方法は正の数では完全に機能しますが、ネガティブでデコードを行うことはできません。

編集:私は、値はInteger.MIN_VALUE + 1(-2147483647)と4つのバイトを処理して試してみたこれをテストするために

+0

あなたの問題が今解決されていればダンノー...私の答えがあなたに役立つかどうかを見てください。負の値を返します。 –

答えて

1

を発注デフォルト(リトルエンディアン、LSB0)バイトとビットを使用して、バイトの配列にint型に変換し、 Askerはさらに の最適化を行った。
私は 参考のために、以下の
linked code自分自身が含まれている:コメントに基づいて(より良い質問を理解する)

へ:ANSWER

編集

private static long toLong(byte[] value) { 
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); 
    final byte val = (byte) (value[0] < 0 ? 0xFF : 0); 

    for(int i = value.length; i < Long.BYTES; i++) 
     buffer.put(val); 

    buffer.put(value); 
    return buffer.getLong(0); 
} 

OLDERあなたのことをにする以下は

private static long toLong(byte[] value) 
{ 
    long res = 0; 
    int tempInt = 0; 
    String tempStr = ""; //holds temp string Hex values 

    tempStr = bytesToHex(value); 

    if (value[0] < 0) 
    { 
     tempInt = value.length; 
     for (int i=tempInt; i<8; i++) { tempStr = ("FF" + tempStr); } 

     res = Long.parseUnsignedLong(tempStr, 16); 
    } 
    else { res = Long.parseLong(tempStr, 16); } 

    return res; 

} 

bytesToHex機能(任意のbyte[]入力してアウトオブボックス機能するようにリファクタリング...)

public static String bytesToHex(byte[] bytes) 
{ String tempStr = ""; tempStr = DatatypeConverter.printHexBinary(bytes); return tempStr; } 
が関連している: &両方 負正数字はこれを試す機能を扱います


+1

これは変数ではありません。「この数字を5バイトに入れる」または「5バイトから数字を取得する」とは言えません。 – SnowyCoder

+0

あなたはちょうど5バイトだけを入れるべきではありません。すべての言語/ OSは1,2,4または8バイトとして一度に読み込まれます。あなたの番号が5バイトしか必要としない場合は、実際には8バイトとして読み取る必要があります。 Arrayの片側に40ビット(5バイト)を保持し、残りの3バイトスロットに0ビットを埋め込むには、[** bit-shifting **](http://stackoverflow.com/a/141873/2057709)を使用してください。 –

+0

私はすでにそれのような(私の質問を参照してください)でしたが、問題は私は負の値を扱う方法がわからないということです – SnowyCoder

1

は、Apache共通Conversion.intToByteArray utilのメソッドを見てみましょう。

のJavaDoc:

作業溶液としてこれを受け入れた後

+0

ちょうどそれをテストしました: – SnowyCoder

+0

'long v = Integer.MIN_VALUE + 1; バイト[] res =新しいバイト[4]; longToByteArray(v、0、res、0、4); long out = byteArrayToLong(res、0、0L、0、4); System.out.println(out); 'negativity lost – SnowyCoder

+0

@SnowyCoderこの回答が機能する場合は、'✓'アイコンを使用して解決策としてマークします。 –

関連する問題