2

C#では、Blowfish.NET 2.1.3のBlowfishECB.csファイルを使用しています(ここにあります

C ++では不明ですが、同様です。

C ++では、Initialize(blowfish)プロシージャは次のとおりです。

void cBlowFish::Initialize(BYTE key[], int keybytes)

C#では、Initialize(blowfish)の手順は同じです

public void Initialize(byte[] key, int ofs, int len) 

これが問題です:

これは、C++でキーが初期化される方法です

DWORD keyArray[2] = {0}; //declaration
...some code
blowfish.Initialize((LPBYTE)keyArray, 8);

ご覧のとおり、キーは2つのDWORDの配列で、合計8バイトです。

C#ではそのように宣言しますが、エラーが発生します

BlowfishECB blowfish = new BlowfishECB();
UInt32[] keyarray = new UInt32[2];
..some code
blowfish.Initialize(keyarray, 0, 8);

エラーは次のとおりです。

引数「1」:「uint[]」から「byte[]」に変換できません

私は何が間違っているのですか?

前もって感謝します!

4

3 に答える 3

5

BitConverterを使用して、UInt32からバイトを取得できます。


これを行うには、ループ内の各要素を変換する必要があります。私は次のようなことをします:

private byte[] ConvertFromUInt32Array(UInt32[] array)
{
    List<byte> results = new List<byte>();
    foreach(UInt32 value in array)
    {
        byte[] converted = BitConverter.GetBytes(value);
        results.AddRange(converted);
    }
    return results.ToArray();
}

戻る:

private UInt32[] ConvertFromByteArray(byte[] array)
{
    List<UInt32> results = new List<UInt32>();
    for(int i=0;i<array.Length;i += 4)
    {
        byte[] temp = new byte[4];
        for (int j=0;j<4;++j)
            temp[j] = array[i+j];
        results.Add(BitConverter.ToUInt32(temp);
    }
    return results.ToArray();
}

于 2009-03-28T14:10:47.480 に答える
4

VS2008またはC#3.5を使用している場合は、次のLINQ+BitConverterソリューションを試してください

var converted = 
  keyArray
    .Select(x => BitConverter.GetBytes(x))
    .SelectMany(x => x)
    .ToArray();

これを分解する

  • Selectは、すべてのUInt32をbyte[]に変換します。結果はIEnumerable<byte[]>です。
  • SelectMany呼び出しは、IEnumerable<byte[]>をIEnumerable<byte>にフラット化します。
  • ToArray()は、列挙可能なものを配列に変換するだけです

同様に機能する非LINQソリューションを編集する

List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
  list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
于 2009-03-28T14:22:53.597 に答える
0

値の型をより高速に変換する方法が必要な場合は、次の回答で説明したハックを使用できます: float[] を byte[] に変換する最速の方法は?

このハックは、メモリ割り当てと反復を回避します。O(1) の配列を別の視点から見ることができます。

もちろん、これはパフォーマンスが問題になる場合にのみ使用してください (時期尚早の最適化は避けてください)。

于 2012-03-12T11:43:00.693 に答える