2

目標は、バイトのすべてのペアを単一の符号なし16ビット整数として変換することです。CIでは16ビットのunsingedintポインターのarray[500]を定義し、それをバイトの配列にポイントしますが、Javaではそのようなショートカットを認識していません。Javaにはchar以外の16ビットデータ型がないことは知っていますが、それは問題ではありません。連続する2バイトごとに整数配列の単一のintにコピーする必要があるだけです。したがって、整数の配列は、0から65535(2 ^ 16-1)の範囲のintの値を保持します。

4

3 に答える 3

4

ByteBufferを使用して、よく間違えるシフトとマスキングを回避できます。(そして、署名されたものと署名されていないものもあります)

ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.BIG_ENDIAN);  // or LITTLE_ENDIAN
short[] shorts = new short[bytes.length/2];
for (int i=0; i<shorts.length; i++)
   shorts[i] = bb.getShort();

注-本当に「unsignedshort」が必要な場合は、Javaにはそのようなものがないため、配列は整数である必要があります。を使用して変換します

for (int i=0; i<intArray.length; i++) {
   short s = bb.getShort();
   intArray[i] = s & 0xFFFF; // mask off all the high order bits
}
于 2012-01-19T19:28:03.223 に答える
2

Javaには、Cで実行できるエイリアシングのような優れたトリックはないと思います。これは手動で行う必要があります。

public int[] pack(byte[] bytes) {
    int n = bytes.length >> 1;
    int[] packed = new int[n];
    for (int i = 0; i < n; ++i) {
        int i2 = i << 1;
        int b1 = bytes[i2] & 0xff;
        int b2 = bytes[i2 + 1] & 0xff;
        packed[i] = (b1 << 8) | b2;
    }
    return packed;
}

(これはおそらく少し高速化できますが、多くのことを行わない限り、1,000要素に対してはおそらく価値がありません。)からbyteへの昇格にintは、不要な符号拡張に対処するための追加の作業が少し必要になることに注意してください。

于 2012-01-19T19:15:47.767 に答える
1

Javaには、実際には符号なし16ビット整数型はありません。言語を乱用していると感じている場合を除いて、おそらくです。 そうは言っても、これは人気のあるGuavaユーティリティライブラリcharを使用する素晴らしい時間です。

public short[] pack(byte[] bytes) {
   short[] result = new short[bytes.length / 2];
   for (int i = 0; i < bytes.length; i += 2) {
     result[i/2] = Shorts.fromBytes(bytes[i], bytes[i+1]);
   }
}

また、パフォーマンスに非常に関心がある場合は、別のカウンターを追加するか、除算の代わりに右シフトを使用できますが、それは十分に簡単です。

于 2012-01-19T19:48:10.247 に答える