C#问题使用blowfish NET:如何从Uint32 []转换为byte []

时间:2009-03-28 14:08:20

标签: c# byte blowfish uint32

在C#中,我正在使用Blowfish.NET 2.1.3的BlowfishECB.cs文件(can be found here

在C ++中,它是未知的,但它是相似的。

在C ++中,Initialize(blowfish)程序如下:

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

在C#中,Initialize(河豚)程序是相同的

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

这是问题所在:

这是在C ++中初始化密钥的方法

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

如您所见,密钥是两个DWORDS的数组,总共8个字节。

在C#中,我声明它,但是我收到错误

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

错误是:

参数'1':无法从'uint []'转换为'byte []'

我做错了什么?

提前致谢!

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:4)

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

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

打破这个

  • Select将每个UInt32转换为byte []。结果是IEnumerable&lt; byte []&gt;
  • SelectMany调用flatn IEnumerable&lt; byte []&gt;到IEnumerable&lt; byte&gt;
  • ToArray()只是将枚举转换为数组

编辑非LINQ解决方案同样适用

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

答案 2 :(得分:0)

如果您需要更快方式来转换您的值类型,您可以使用我在以下答案中描述的hack:What is the fastest way to convert a float[] to a byte[]?

这个hack避免了内存分配和迭代。它在O(1)中为您提供了不同的数组视图。

当然,如果性能问题,你应该只使用它(避免过早优化)。