0

そのため、特定のデータ型を13ビットエンコーディングに分割する必要があるソリューションに取り組んでおり、文字列以外のすべてを処理できます。

したがって、これをコーディングするための手順です。

文字列をバイト配列に変換する

バイトを 13 にビット シフトして short の最初のバイトを収集する

5 で次のバイトをビットシフトし、最初の short を得るために short でそれ

これは反復するのが面倒になっています。アプローチはすべて間違っていると思います。可能な解決策を得ることができますか?

4

3 に答える 3

2

を使用しBigIntegerます。で初期化しbyte[]ます。ゼロではありませんが、メソッドで 13 ビットをマスクしand()、短い via に変換しintValue()ます。で右に 13 ビットシフトしshiftRight()、繰り返します。

于 2013-01-09T00:06:58.470 に答える
1

OpenLRには、こちらから入手できるバイナリ ライブラリがあります。

ByteArrayBitstreamInputコンストラクターでパラメーターを受け取るクラスがあり、byte[]任意の数のビットを取得して、getInt()それを にキャストできshortます。

于 2013-01-09T00:05:55.613 に答える
1

このコードは軽くテストされています。これは低レベルのソリューションですが、大きなオーバーヘッドはありません (入力全体のシフト、ガベージ生成、ライブラリの肥大化など)。

// Length of shorts array must be at least (8 * bytes.length + 12) / 13.
static void convert(byte[] bytes, short[] shorts) {
    int nBitsAvail = 13;
    int i = 0;
    for (byte b : bytes) {
        if (nBitsAvail >= 8) {
            // Entire byte fits in available space in short.
            shorts[i] = (short) ((shorts[i] << 8) | b);
            nBitsAvail -= 8;
        } else {
            // Byte must be split between bits remaining in this short and the next.
            int nBitsNeeded = 8 - nBitsAvail ;
            shorts[i] = (short) ((shorts[i] << nBitsAvail) | (b >> nBitsNeeded));
            shorts[++i] = (short) (b & (0xff >> nBitsAvail));
            nBitsAvail = 13 - nBitsNeeded;
        }
    }
    shorts[i] <<= nBitsAvail;
}
于 2013-01-09T00:07:06.613 に答える