2012-05-03 9 views
0

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

表:

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

私はこの方法に

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

を使用してBitArrayへのByteArrayに変換しかし、私はそこに立ち往生しています、私は応じてビットをシフトする方法がわかりませんテーブルに格納し、次にByteArrayに戻します。

EDIT:

コードSnipet:

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); 
} 

私の入力バイト配列は "00804804A02A1CA20100000000000000D2F8B6FABBB700000000000000000000" であるとzimdanenのコードと私の出力が "5012000000000000000000000000000000000000000000000000000000000000" であり、それはあなたのように、 "501200002FD901000000000400000000BFE8C4DB140D11F40000000000000000" する必要がありますそれは最初の2バイトを正しく取得しますが、残りはすべてnullです。

+0

これはまったく高速でも正確でなければならないのですか? – harold

+0

[c# - バイト配列全体を左シフト] [1]への私の答えを見てください。 [1]:方法は「wasn場合http://stackoverflow.com/questions/8440938/c-sharp-left-shift-an-entire-byte-array/8450271#8450271 – JamieSee

+0

私は気にwouldntは最も速く、私はそれが操作を正しく行うことに本当に気を付けます。 –

答えて

1

必要がありますか?あなたはこのようにそれを行うことができ、あなたのマッピング「テーブル」を維持する方法に応じて、

BitArray source = new BitArray(bytes); 

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

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

か:あなたは新しいBitArrayを作成し、ちょうど上のビットをコピーすることができます

// 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]; 
} 
+0

doesntのはただのByteArray EDITに戻って、それに応じてビットをシフトする必要があると、場所にする必要があります:私はあなたのコードを見て、私はそれが正しい:) –

+0

私の入力バイト配列を作業し得るかどうかを確認しますと、「00804804A02A1CA20100000000000000D2F8B6FABBB700000000000000000000」で、あなたのコードで私の出力は "501200000000000000000000000000000000000000000000000000000000000000"であり、 "501200002FD901000000000400000000BFE8C4DB140D11F40000000000000000" のようになります。ご覧のとおり、最初の2バイトは正しく取得されますが、すべてゼロになります。 –

+0

完全なコードスニペットを投稿できますか? – zimdanen

1

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

「.... 50120000FFFFFF」私はあなたが結果があることを見つけると思います

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; 
} 

あなたはコピーを行う前には0xFFと目的地を埋めるためにあなたのBitArrayToByteArray方法を変更することでこれを確認することができます

あなたがしようとしていることを正確に伝えるのは難しいです。文字列のバイトをスクランブルする場合は、BitArrayを使用する必要はありません。本当にビットをスクランブルしたい場合は、すべてのビットをスクランブルする必要があります。あなたがしようとしていることについての詳細な情報がなければ、私は示唆を持っていません。それ以外の場合は、独自の暗号アルゴリズムを使用してください。

+0

すごいよ!ありがとうございました! 実際に私自身のアルゴリズムをここで書こうとしていません。ゲームからファイルを復号化して暗号化するだけです。 :) –