Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C使用河豚网的问题:如何从Uint32[]转换为字节[]_C#_Byte_Blowfish_Uint32 - Fatal编程技术网

C# C使用河豚网的问题:如何从Uint32[]转换为字节[]

C# C使用河豚网的问题:如何从Uint32[]转换为字节[],c#,byte,blowfish,uint32,C#,Byte,Blowfish,Uint32,在C语言中,我使用的是Blowfish.NET2.1.3的BlowfishECB.cs文件 C++中,它是未知的,但它是相似的。 在C++中,初始化BrimoFISH程序如下: void cBlowFish::Initialize(BYTE key[], int keybytes) 在C中,初始化BlowFish过程是相同的 public void Initialize(byte[] key, int ofs, int len) 这就是问题所在: 这是在C中初始化密钥的方式++ DWOR

在C语言中,我使用的是Blowfish.NET2.1.3的BlowfishECB.cs文件

C++中,它是未知的,但它是相似的。 在C++中,初始化BrimoFISH程序如下:

void cBlowFish::Initialize(BYTE key[], int keybytes)
在C中,初始化BlowFish过程是相同的

public void Initialize(byte[] key, int ofs, int len) 
这就是问题所在:

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

DWORD keyArray[2] = {0}; //declaration
...some code
blowfish.Initialize((LPBYTE)keyArray, 8);
如您所见,键是两个DWORD的数组,总共是8个字节

在C语言中,我这样声明,但我得到一个错误

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

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

我做错了什么

提前谢谢

您可以使用从UInt32获取字节

为此,需要转换循环中的每个元素。我会这样做:

返回:


如果您使用的是VS2008或C 3.5,请尝试以下LINQ+位转换器解决方案

var converted = 
  keyArray
    .Select(x => BitConverter.GetBytes(x))
    .SelectMany(x => x)
    .ToArray();
分解这个

Select将每个UInt32转换为字节[]。结果是一个IEnumerable SelectMany调用将IEnumerable变为IEnumerable ToArray只是将可枚举项转换为数组 编辑同样有效的非LINQ解决方案

List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
  list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
如果您需要一种更快的方法来转换您的值类型,您可以使用我在以下答案中描述的hack:

这种黑客可以避免内存分配和迭代。它为您提供了O1中阵列的不同视图


当然,只有在性能存在问题时才应该使用此选项,以避免过早优化。

@Reed Copsey,我尝试过它,但它变得更糟:参数“1”:无法从“uint[]”转换为“double”。这是uint数组,而不是uint。如果使用C 3和linq,JaredPar的选项是一个不错的选项。我将C与C 2008 Express SP1一起使用,但是我在那里也有错误。@John:我编辑的代码应该可以工作。。。你收到了什么错误?@Reed Copsey,谢谢!我现在正在尝试,但是您能添加一个从byte[]转换为Uint[]的函数吗?应将相同的8个字节转换为UInt[]数组,该数组的2个成员与源代码中的相同。@JaredPar我收到错误:“System.array”不包含“Select”的定义,并且找不到接受“System.array”类型的第一个参数的扩展方法“Select”。是否缺少using指令或程序集引用//终止error@John,您使用的是VS2005还是VS2008?如果是2008,请确保使用System.Linq添加到文件的顶部。如果没有,我将更新VS2005solution@John:您可以使用我的代码,也可以使用参考System.Linq和C 3/VS 2008。@Reed Copsey,我将尝试您的代码,但我可能需要一个将字节[]转换为Uint32[]的函数,因为在这段代码下面我称为blowfish.Encode@JaredPar,我对C非常陌生,我以前的语言是Delphi,我不能适应C。我使用的是C Express 2008。你能一步一步地解释一下该怎么做吗。@John,如果你使用的是C Express 2008,两种解决方案都可以。如果第一个不起作用,请转到文件的顶部,并确保有一行写着using System.Linq;这个问题不仅对于使用Blowfish的应用程序来说很有趣,对于任何需要进行数据操作以在不同类型的数组之间转换的应用程序来说也很有趣。
var converted = 
  keyArray
    .Select(x => BitConverter.GetBytes(x))
    .SelectMany(x => x)
    .ToArray();
List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
  list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();