3

byte[]サイズ4のをAndroidアプリ用にlongと入力するように変換する必要があります。パッケージに含まれている関数を見つけましたが、アプリケーションで機能していませbyteArrayToLong(byte_array)ん。java.io.Bits

他に代替機能はありますか?

4

5 に答える 5

2

使用java.nio.ByteBuffer

byte[] data = new byte[] {50, -106, 40, -22};
ByteBuffer buffer = ByteBuffer.wrap(data);
System.out.println(buffer.getLong());

編集

もちろん、@Kaitoは正しいです。代わりに8バイトの配列が必要です。また、他の人が述べたように、バイトが読み取られる順序を選択できます(BIG_ENDIANデフォルト)。

    byte[] data = new byte[] {50, -106, 40, -22, 0, 0, 0, 0};
    ByteBuffer buffer = ByteBuffer.wrap(data);
    buffer.order(ByteOrder.BIG_ENDIAN);
    System.out.println(buffer.getLong()); // 3645145933890453504
    buffer = ByteBuffer.wrap(data);
    buffer.order(ByteOrder.LITTLE_ENDIAN);
    System.out.println(buffer.getLong()); // 3928528434

また、なぜAPIメソッドを好むのですか?簡単にするために、ビット単位のシフトでバイトからロングへの変換を認識する代わりに、ここで何が起こるかを平易な英語で読むことができます。

于 2012-06-19T19:25:19.540 に答える
2

答えは、最初のバイトが最下位バイトか最上位バイトかによって異なります。

最初のバイトが最も重要な場合

long val = 0;

for (int i = 0; i < YourByte.length; i++)
{
   val = (val << 8) + (YourByte[i] & 0xff);
}

最初のバイトが最下位バイトの場合

long val = 0;

for (int i = 0; i < YourByte.length; i++)
{
   val += ((long) YourByte[i] & 0xffL) << (i*8);
}

編集

8バイトを超える場合BigIntegerは代わりに使用してください。long

于 2012-06-19T19:25:48.900 に答える
2

医者の答えはうまくいきますが、私はそれをループなしでやります。

リトルエンディアンの場合(最も可能性の高いケース):

long val = b[0] | ((int)(b[1]) << 8) | ((int)(b[2]) << 16) | ((int)(b[3]) << 24);

ビッグエンディアンの場合:

long val = b[3] | ((int)(b[2]) << 8) | ((int)(b[1]) << 16) | ((int)(b[0]) << 24);

また、Javalongの長さは8バイトであることに注意してください。4バイトの場合、anintで十分です。

于 2012-06-19T19:30:57.790 に答える
1

3つのオプションが思い浮かびます。

  1. 配列をBigIntegerコンストラクターに渡し、BigIntegerからlong値をフェッチします
  2. 配列に別の4バイトを埋め込み、ByteBuffer.wrapを使用してからgetLongを使用します
  3. 各バイトを所定の位置にシフトして手動で作成します。

エンディアンによっては、配列を逆にする必要がある場合があります。

于 2012-06-19T19:28:18.130 に答える
0

サイズが8バイト未満のbyte[]long型に変換する場合

public static ByteBuffer byteArraytoByteBuffer(int capacity,byte[] array) { ByteBuffer buffer = ByteBuffer.allocate(capacity).put(array).order(ByteOrder.LITTLE_ENDIAN); buffer.rewind(); return buffer; }

それから

byte[] input = new byte[]{1,0,0,0};
long value = byteArraytoByteBuffer(8,input).getLong();

1. ByteBuffer.allocate(capacity)は、long型に8バイトを割り当てます。

バッファ={0,0,0,0,0,0,0,0}

2. put(array)は4バイトを配置します

バッファ={1,0,0,0,0,0,0,0}

           ^
           |

現在、バッファの位置は4です。

3.バイトオーダーは、要件に基づいてLITTLE_ENDIANまたはBIG_ENDIANになります。

4. buffer.rewind()バッファを巻き戻し、位置をゼロに設定します。

バッファ={1,0,0,0,0,0,0,0}

       ^
       |

buffer.rewind()操作が行われない場合、バッファアンダーフローが発生します。位置が4であるため、getLong()が呼び出されると、開始インデックスが4になります。

同じコードを使用してbyte[]をintに変換できます

byte[] input = new byte[]{1,0,0,0};
long value = byteArraytoByteBuffer(4,input).getInt();

于 2017-06-30T05:02:54.710 に答える