C#问题,使用河豚网:如何将从Uint32[]字节[]
题
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();
如果您需要的更快的方式转换成你的值类型,你可以用我下面的答案中描述的黑客:的什么是为float []转换成一个byte [] 一的最快方法>
此劈避免内存分配和迭代。它给你在O您的阵列的不同视图(1)。
当然,你应该只使用这个,如果性能是一个问题(避免过早优化)。
不隶属于 StackOverflow