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

发布于 2024-07-16 04:10:14 字数 897 浏览 13 评论 0原文

在 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);

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

在 C# 中,我这样声明,但出现错误 错误

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

是:

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

我做错了什么?

提前致谢!

In C#,I'm using Blowfish.NET 2.1.3's BlowfishECB.cs file(can be found here)

In C++,It's unknown,but it is similiar.

In C++,the Initialize(blowfish) procedure is the following:

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

In C#,the Initialize(blowfish) procedure is the same

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

This is the problem:

This is how the key is initialized in C++

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

As you see,the key is an array of two DWORDS,which is 8 bytes total.

In C# I declare it like that,but I get an error

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

The error is:

Argument '1': cannot convert from 'uint[]' to 'byte[]'

What am I doing wrong?

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

十级心震 2024-07-23 04:10:14

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

You can use BitConverter to get the bytes from a UInt32.


To do this, you'll need to convert each element in a loop. I would do something like:

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();
}

To go back:

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();
}

眼眸里的那抹悲凉 2024-07-23 04:10:14

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

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

分解

  • 此 Select 将每个 UInt32 转换为 byte[]。 结果是 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();

If you are using VS2008 or C# 3.5, try the following LINQ + BitConverter solution

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

Breaking this down

  • The Select converts every UInt32 into a byte[]. The result is an IEnumerable<byte[]>
  • The SelectMany calls flattes the IEnumerable<byte[]> to IEnumerable<byte>
  • ToArray() simply converts the enumerable into an array

EDIT Non LINQ solution that works just as well

List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
  list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
旧话新听 2024-07-23 04:10:14

如果您需要更快的方式来转换值类型,您可以使用我在以下答案中描述的技巧:将 float[] 转换为 byte[] 的最快方法是什么?

这个 hack避免内存分配和迭代。 它以 O(1) 的时间复杂度为您提供了数组的不同视图。

当然,只有在性能存在问题时才应该使用它(避免过早优化)。

If you need a faster way to convert your value types, you can use the hack I described in the following answer: What is the fastest way to convert a float[] to a byte[]?

This hack avoid memory allocations and iterations. It gives you a different view of your array in O(1).

Of course you should only use this if performance is an issue (avoid premature optimization).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文