C#我是用Blowfish.NET 2.1.3的BlowfishECB.cs文件(文件可以在这里找到)

C++,这是未知的,但是它类似。

C++、初始化(河豚)程序如下:

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

C#中,初始化(河豚)程序是相同的

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

这是问题所在:

这是如何的关键是用C++进行初始化

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

正如你看到的,关键的是一系列两个双字,这是8个字节的总和。

C#我宣布它喜欢这样,但我得到一个错误

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

错误是:

参数'1':不能把'uint[]'到'字节[]'

我做错了什么?

在此先感谢!

有帮助吗?

解决方案

您可以使用 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();
}

其他提示

如果您使用的是VS2008或C#3.5,尝试以下的皇宫+BitConverter解决方案

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

打破这种下

  • 选择将每UInt32成一个字节[].结果是一种综合<byte[]>
  • 该SelectMany呼吁flattes的类型<byte[]> 要类型<byte>
  • ToArray()简单地转换为可枚举的成一列

编辑 不皇宫的解决方案,作品一样好

List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
  list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
scroll top