0

ByteArray からビットを操作する方法を知りたいです。私が必要とするのは、私が持っている「テーブル」に従ってビットをシフトすることです。

テーブル:

Bit 0 -> Bit 26
Bit 1 -> Bit 31
Bit 2 -> Bit 17
...
Bit 31 -> Bit 5

このメソッドを使用して ByteArray を BitArray に変換します

public static BitArray ByteArraytoBitArray(byte[] bytes)
{
    BitArray bits = new BitArray(bytes);
    return bits;
}

テーブルに従ってビットをシフトしてからByteArrayに戻す方法がわかりません。

編集:

コード スニペット:

public static byte[] StringToByteArray(String hex)
{
    int NumberChars = hex.Length;
    byte[] bytes = new byte[NumberChars / 2];
    for (int i = 0; i < NumberChars; i += 2)
        bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
    return bytes;
}
private void button3_Click(object sender, EventArgs e)
{
    string featherearring = "00804804A02A1CA20100000000000000D2F8B6FABBB700000000000000000000";
    var strarray = StringToByteArray(featherearring);

    byte[] strarray_comp = Enc.Encrypt(strarray);

    string conv = BitConverter.ToString(strarray_comp);
    MessageBox.Show(conv.Replace("-", ""));
}



public static byte[] BitArrayToByteArray(BitArray bits)
{
    byte[] bytes = new byte[bits.Length / 8];
    bits.CopyTo(bytes, 0);
    return bytes;
}
public static byte[] Encrypt(byte[] input)
{
    BitArray source = new BitArray(input);
    BitArray target = new BitArray(source.Length);

    target[26] = source[0];
    target[31] = source[1];
    target[17] = source[2];
    target[10] = source[3];
    target[30] = source[4];
    target[16] = source[5];
    target[24] = source[6];
    target[2] = source[7];
    target[29] = source[8];
    target[8] = source[9];
    target[20] = source[10];
    target[15] = source[11];
    target[28] = source[12];
    target[11] = source[13];
    target[13] = source[14];
    target[4] = source[15];
    target[19] = source[16];
    target[23] = source[17];
    target[0] = source[18];
    target[12] = source[19];
    target[14] = source[20];
    target[27] = source[21];
    target[6] = source[22];
    target[18] = source[23];
    target[21] = source[24];
    target[3] = source[25];
    target[9] = source[26];
    target[7] = source[27];
    target[22] = source[28];
    target[1] = source[29];
    target[25] = source[30];
    target[5] = source[31];

    return BitArrayToByteArray(target);
}

my input byte array is "00804804A02A1CA20100000000000000D2F8B6FABBB700000000000000000000" and my output with zimdanen's code is "5012000000000000000000000000000000000000000000000000000000000000" and it should be "501200002FD901000000000400000000BFE8C4DB140D11F40000000000000000" As you can see, it gets the first 2 bytes right, but the rest is are all null.

4

2 に答える 2

1

最初の問題は、に変換する32バイトの配列があることですBitArray。プロパティの値source.Countは256target.Countです。一方、32のみです。したがって、Encryptメソッドはビット配列の最初の32ビットのみを変更します。これは4バイト(16進文字の8文字)に対応します。配列の残りの部分はnullになります。

これを確認するBitArrayToByteArrayには、コピーを実行する前に、宛先を0xFFで埋めるようにメソッドを変更します。

public static byte[] BitArrayToByteArray(BitArray bits)
{
    byte[] bytes = new byte[bits.Length / 8];
    // Fill the array with 0xFF to illustrate.
    for (int i = 0; i < bytes.Length; ++i)
    {
        bytes[i] = 0xFF;
    }
    bits.CopyTo(bytes, 0);
    return bytes;
}

結果は「50120000FFFFFF...」であることがわかると思います。

あなたが何をしようとしているのかを正確に伝えるのは難しいです。文字列内のバイトをスクランブルする場合は、を使用する必要はありませんBitArray。本当にビットをスクランブルしたい場合は、すべてのビットをスクランブルする必要があります。あなたがやろうとしていることについてのより多くの情報がなければ、私は提案がありません。おそらく、独自の暗号化アルゴリズムを使用するのではなく、既存の多くの暗号化アルゴリズムの1つを使用する必要があることを除いて。

于 2012-05-04T05:08:25.420 に答える
1

設置する必要がありますか?新しい BitArray を作成して、ビットをコピーするだけです。

BitArray source = new BitArray(bytes);

// Create target array.
BitArray target = new BitArray(source.Length);

// Map bits.
// ...
target[26] = source[0];
// ...

または、マッピング「テーブル」を維持する方法に応じて、次のようにすることができます。

// Setup mapping - <source, target>.
Dictionary<int, int> mapping = new Dictionary<int, int>();
// ...
mapping.Add(0, 26);
// ...

BitArray source = new BitArray(bytes);

// Create target array.
BitArray target = new BitArray(source.Length);

// Map bits.
foreach (int sourceIndex in mapping.Keys)
{
    int targetIndex = mapping[sourceIndex];
    target[targetIndex] = source[sourceIndex];
}
于 2012-05-03T17:12:57.070 に答える