質問

私の配列128boolean値を代入を表すビット.どのように交換することはできまこれらの128ビット表現への16バイト?

例:

いる配列は以下のようなものです:

0110001100110000100010111011001011010011010001010001101101001100
1000010000000000001000111111111101000011111001111011111011111001

換算1sと0s時は選択できます簡潔)

I変換する必要があるこれらのビットのバイト配列:

99 48 139 178 211 69 27 76 132 0 35 255 67 231 190 249

編集:このように見えませんの仕事:

public byte[] ToByteArray() {
    int numBytes = Count / 8;

    if (_bits.Count % 8 != 0) numBytes++;

    byte[] bytes = new byte[numBytes];

    int byteIndex = 0, bitIndex = 0;

    for (int i = 0; i < _bits.Count; i++) {
        if (_bits[i])
            bytes[byteIndex] |= (byte)(1 << bitIndex);

        bitIndex++;
        if (bitIndex == 8) {
            bitIndex = 0;
            byteIndex++;
        }
    }

    return bytes;
}

として出力:

198 12 209 77 203 162 216 50 33 0 196 255 194 231 125 159
役に立ちましたか?

解決

のコードでは、ワードの下位ビットとして最初のビットを処理されるので、あなたは逆に、各単語で終わります。間に合わせおよびフィックスとして、これを試してみます:

bytes[byteIndex] |= (byte)(1 << (7-bitIndex));

つまりなど、最初のバイトで最も高い位置に配列の最初のビットを置く。

他のヒント

わからないがあった場合は自動的について教えてくださいが行うことができるので単純なアルゴリズムです。

単純なアルゴリズム

  1. をバイト配列されている出力バッファの初期化全てのバイトを0になります。オンライン格付情報サー配列に基づくべきである長さを入力boolean型配列:ceil(bool_array_length/8.0)

  2. を宣言するのは、インデックス変数として使用する現在のバイトに設定して0になります。このインデックス出力バッファです。

  3. に対して繰り返し処理を実行内の各要素ご入力boolean配列になります。
    3.1.左ビットシフト数1の配列インデックスのmod8.この番号に電話をごマスクです。
    3.2.計算バイト指数として現在のインデックスの配列div8.
    3.3.またboolean true 値は、現在のインデックスに入力boolean配列、な bitwise OR お現在のバイトとマスクです。

bool[] bools = ...
BitArray a = new BitArray(bools);
byte[] bytes = new byte[a.Length / 8];
a.CopyTo(bytes, 0);
<時間>

編集:実はこれも返されます:

198 12 209 77 203 162 216 50 33 0 196 255 194 231 125 159

間違っエンディアン?私は参考のために、とにかく答えて残しておきます。

<時間>

EDIT:あなたがそうのような配列を逆転させることによりBitArray.CopyToを()を使用することができます:

bool[] bools = ...
Array.Reverse(bools); // NOTE: this modifies your original array
BitArray a = new BitArray(bools);
byte[] bytes = new byte[a.Length / 8];
a.CopyTo(bytes, 0);
Array.Reverse(bytes);

(拡張メソッドとして書かれた)は、この機能を試してみます。

public byte[] ToByteArray(this bool[] bits)
{
    var bytes = new byte[bits.Length / 8];
    for (int i = 0, j = 0; j < bits.Length; i++, j += 8)
    {
        // Create byte from bits where LSB is read first.
        for (int offset = 0; offset < 8; offset++)
            bytes[i] |= (bits[j + offset] << offset);
    }

    return bytes;
}

注:ビット数(bools)は8の倍数ではありませんが、あなたの質問から判断すると、そうでない場合には失敗します。それだけで、任意の長さのビット配列を可能にするために、非常に小さなmodificaitonを取るます。

private static byte[] GetBytes(string bitString)
{
    byte[] result = Enumerable.Range(0, bitString.Length / 8).
        Select(pos => Convert.ToByte(
            bitString.Substring(pos * 8, 8),
            2)
        ).ToArray();

    List<byte> mahByteArray = new List<byte>();
    for (int i = result.Length - 1; i >= 0; i--)
    {
        mahByteArray.Add(result[i]);
    }

    return mahByteArray.ToArray();
}

private static String ToBitString(BitArray bits)
{
    var sb = new StringBuilder();

    for (int i = bits.Count - 1; i >= 0; i--)
    {
        char c = bits[i] ? '1' : '0';
        sb.Append(c);
    }

    return sb.ToString();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top