2010-11-28 2 views
44

バイト配列の値を変更して、MSBに長いタイムスタンプ値を入れたいとします。誰かが私にそれをする最善の方法を教えてくれる?私は非常に非効率的だと思うビットごとに値を挿入したくありません。私が欲しいもの長い配列をバイト配列に変換して別の配列に追加する

long time = System.currentTimeMillis(); 
Long timeStamp = new Long(time); 
byte[] bArray = new byte[128]; 

のようなものです:

byte[0-63] = timeStamp.byteValue(); 

は、この可能性のようなものです。このバイト配列の値を編集/挿入する最も良い方法は何ですか?バイトはプリミティブなので、私が使うことができるいくつかの直接の実装はないと思いますか?

編集:
間違っているなら、私を修正するので、it.Pleaseによって、上記のコードを置き換え、System.currentTimeMillis()Calendar.getTimeInMillis()よりも高速であると思われます。

+0

これは参考になりました:http://stackoverflow.com/questions/5399798/byte-array-and-int-conversion-in-java – TacB0sS

+0

私はあなたがインデックスが間違ってカウントを持っていると思うが、この質問をチェックアウト: http://stackoverflow.com/questions/5399798/byte-array-and-int-conversion-in-java – TacB0sS

答えて

121

それを行うには、複数の方法があります。

  • ByteBuffer(最良の選択肢 - 簡潔で読みやすい)を使用してください:

    byte[] bytes = ByteBuffer.allocate(Long.SIZE/Byte.SIZE).putLong(someLong).array(); 
    
  • ます。また、(より詳細な)DataOutputStreamを使用することができます:

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    DataOutputStream dos = new DataOutputStream(baos); 
    dos.writeLong(someLong); 
    dos.close(); 
    byte[] longBytes = baos.toByteArray(); 
    
  • 最後に、このマニュ味方(ヘクターのコードでLongSerializerから撮影)(読みにくい):

    byte[] b = new byte[8]; 
    for (int i = 0; i < size; ++i) { 
        b[i] = (byte) (l >> (size - i - 1 << 3)); 
    } 
    

その後、あなたは単純なループにより、既存のアレイにこれらのバイトを追加することができます

// change this, if you want your long to start from 
// a different position in the array 
int start = 0; 
for (int i = 0; i < longBytes.length; i ++) { 
    bytes[start + i] = longBytes[i]; 
} 
+0

Bozhoに感謝します。私はこれが私が探していたものだと思います。私は最初の方法が後の方法より速いと思う。私はバイト配列の代わりにByteBufferを使用することによるパフォーマンスの影響を懸念しています。このリンクでは、nedバイトバッファlibのパフォーマンスについて詳しく説明しています。http://jroller.com/cpurdy/date/20040405#raw_nio_performance;また、影響が大きすぎない場合は、バイト配列の代わりにByteBufferを使用できますか? – codeObserver

+0

'ByteBuffer'を使用してください。私はそれが問題を引き起こすのではないかと疑う。 – Bozho

+4

ByteByfferの順番をそうしなければならないことが分かりました。そうでなければ、バイトは、私が期待していたものとは逆の順序になっていた[] bytes = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong (ビット).array(); –

0

バイト配列をスライスして、バイト単位で処理せずにサブセットに何かを挿入するようなことはありません。 Grab a segment of an array in Java without creating a new array on heapを見てください。基本的には、64バイトの配列を作成し、それに時間を設定して空白の64バイト配列を追加することです。バイトごとに行うだけです。

0

私は私はちょうどバイト配列(と戻る)にロングを変換するライブラリのプレリリース版を発表したので、この記事を更新します。ライブラリは非常に小さく、Javaプリミティブをバイト配列に変換します。

http://rschilling.wordpress.com/2013/09/26/pre-release-announcement-pend-oreille/ http://code.google.com/p/pend-oreille/

あなたがそれを使用している場合は、バイト配列に変換長い配列のようなものを行うことができますに:

Double[] doubles = new Double[1000]; 
for (int i = 2; i < 1002; i++) { 
    doubles[i - 2] = (double) i; 
} 

byte[] resultBytes1 = (byte[]) new PrimitiveHelper(PrimitiveUtil.unbox(doubles)) 
     .asType(byte[].class); 

あなたはまた、同様に、単一のlong値を変換することができます。

byte[] resultBytes1 = (byte[]) new PrimitiveHelper(1000l) 
     .asType(byte[].class); 

フィードバックをお寄せください。2013年10月4日に

更新: 私は今、図書館の生産をリリースしたhttp://rschilling.wordpress.com/2013/10/04/pend-oreille-official-1-0-release/

17

あなたが本当にボンネットの下に取得したい場合は...私にとっては

public byte[] longToByteArray(long value) { 
    return new byte[] { 
     (byte) (value >> 56), 
     (byte) (value >> 48), 
     (byte) (value >> 40), 
     (byte) (value >> 32), 
     (byte) (value >> 24), 
     (byte) (value >> 16), 
     (byte) (value >> 8), 
     (byte) value 
    }; 
} 
3

のByteBufferと他のユーティリティは時間の観点から高価です。ここでは、使用できる2つの方法です:あなたが既に持っている場合は

//最初の方法(つまり、第二の方法を使用している)、それが割り当てられた配列を返すと

public byte[] longToByteArray(long value) 
{ 
     byte[] array = new byte[8]; 

     longToByteArray(value,array,0); 
     return array; 
} 

を満たし//この方法が便利ですバッファを割り当て、配列の特定の場所を長時間書きたいとします。

public void longToByteArray(long value, byte[] array, int startFrom) 
{ 
    for (int i=7; i>=0; i--) 
    { 
     array[startFrom+7-i] = (byte) (value >> i*8); 
    } 
} 
関連する問題