0

long と bytearray を別の bytearray に連結しようとしています。

私はこのように試しました:

byte[] value1= new byte[16];
byte[] value2= new byte[16];
byte[] finalvalue = new byte[value1.length + value2.length];
long ts = System.currentTimeMillis();
int val = 100;

ByteBuffer.wrap(value1).order(ByteOrder.LITTLE_ENDIAN).asLongBuffer().put(ts);
ByteBuffer.wrap(value2).order(ByteOrder.LITTLE_ENDIAN).asIntBuffer().put(val);

System.arraycopy(value1, 0, finalvalue, 0, value1.length);
System.arraycopy(value2, 0, finalvalue, value1.length,value2.length);

これを印刷しようとすると、正しい値が得られません。このように印刷します

BYTEVALUE -95-15-4410659100000000002000000000000000

このように印刷する必要があります

- BYTEVALUE- 1354707038625,100

私が間違っているところを誰かが助けてくれますか。

助けていただければ幸いです。

アップデート:

次のようにStringBufferを使用して値を出力するために使用します。

StringBuffer sb = new StringBuffer(finalvalue.length);
for (int i = 0; i < finalvalue.length; i++) {
  sb.append(finalvalue[i]);
}
4

1 に答える 1

2

あなたのコードは、あなたが思っていることをしていません。次の自己完結型アプリケーションを検討してください。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class ByteArrayTest {

  public static void main(String[] args) {
    byte[] value1 = new byte[16];
    byte[] value2 = new byte[16];
    byte[] finalvalue = new byte[value1.length + value2.length];
    long ts = System.currentTimeMillis();
    int val = 100;

    ByteBuffer.wrap(value1).order(ByteOrder.LITTLE_ENDIAN).asLongBuffer()
        .put(ts);
    ByteBuffer.wrap(value2).order(ByteOrder.LITTLE_ENDIAN).asIntBuffer()
        .put(val);

    System.arraycopy(value1, 0, finalvalue, 0, value1.length);
    System.arraycopy(value2, 0, finalvalue, value1.length, value2.length);

    printByteArray(finalvalue);
  }

  private static void printByteArray(final byte[] array) {
    StringBuilder sb = new StringBuilder(array.length);
    for (byte b : array) {
      sb.append(String.format("%02X", b));
    }
    System.out.println(sb.toString());
  }
}

これの出力は次のとおりです。

BE26086B3B010000000000000000000064000000000000000000000000000000

これを構成要素に分割すると、その理由がわかります。

  • 最初の 16 バイトはBE26086B3B0100000000000000000000. これはリトル エンディアン順のタイムスタンプです。ゼロ バイトを無視すると1,354,710,394,558、これは正しい 10 進数に変換されます。

  • 2 番目の 16 バイトは64000000000000000000000000000000、ハードコードされた値100です。

ゼロは、使用しなかったバイト配列内のスペースを表します。

于 2012-12-05T12:28:23.707 に答える