1

ここに 1 つの文字列があり、この文字列を long に変換し、この long 値をバイトに変換しました。このバイト配列の長さは 6 です。

    final byte[] tagBytes = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN)
            .putLong(Long.parseLong("02201156116")).array();
    System.arraycopy(tagBytes, 0, tag, 0, 6);
    Log.d("TAG", "TAG in bytes "+Arrays.toString(tag));

ここで私はこのような出力を得ました[52, 84, 49, -125, 0, 0]

今、私は以前のようにこの出力バイトを文字列に変換したい"02201156116"

したがって、ここでは、最初に BIG_ENDIAN でバイトを順序付けてから、Bytes をラップして、そこから long 値を取得する必要があります。しかし、ここで私はなぜそれがうまくいかないのか驚いています

ByteBuffer.wrap(tempDateBytes).order(ByteOrder.BIG_ENDIAN).getLong() 

これとその作業

ByteBuffer.wrap(tempDateBytes).order(ByteOrder.LITTLE_ENDIAN).getLong()これは、Long をバイトに変換するときに LITTLE_ENDIAN を使用したため、BIG_ENDIAN を適用する必要があります。したがって、ここでは BIG_ENDIAN を使用する必要があると思います。ただし、BIG_ENDIAN では機能せず、LITTLE_ENDIAN では機能します。

私が変換するために使用したこの[52, 84, 49, -125, 0, 0]コード02201156116

    long time,time1;
    final byte[] tempDateBytes = new byte[8];
    System.arraycopy(tagBytes, 0, tempDateBytes, 0, 6);
    time1 = ByteBuffer.wrap(tempDateBytes).order(ByteOrder.BIG_ENDIAN).getLong();
    time = ByteBuffer.wrap(tempDateBytes).order(ByteOrder.LITTLE_ENDIAN).getLong();
    Log.d("TAG", "Orignal TAG "+time);
    Log.d("TAG", "BAD TAG  "+time1);
4

1 に答える 1

2

の観点から考えてみてください short。値 258 をエンコードするとします。

258 = 256 + 2 = 0x0102

これを配列に入れる場合、インデックス 0 に入れるバイトを決定する必要があります。

{ 0x01, 0x02 }

また

{ 0x02, 0x01 }

順序自体が他の順序よりも優れているということはありませんが、重要な点は、配列をデコードして値 258 を取得したい場合に、使用した順序を覚えておくことです。

これが LITTLE_ENDIAN と BIG_ENDIAN の目的です。エンコーディングでは、使用するバイト順を示します。デコード時に、エンコード時に使用したバイト順を示します。

したがって、混乱しないように、エンコードとデコードで同じバイト順を使用してください。

于 2013-02-20T12:50:57.610 に答える