C#将uint[]转换为byte[]

4

这可能是一个简单的问题,但我似乎找不到一个简单的方法来解决它。我需要将一个由84个无符号整数(uint)组成的数组保存到SQL数据库的BINARY字段中。因此,在我的C# ASP.NET项目中,我使用以下代码:

//This is what I have
uint[] uintArray;

//I need to convert from uint[] to byte[]
byte[] byteArray = ???

cmd.Parameters.Add("@myBindaryData", SqlDbType.Binary).Value = byteArray;

那么如何将uint[]转换为byte[]呢?

1
这些值是否在有效的字节范围内? - Ilia G
不好意思,我需要将每个uint分成4个字节,而不是通过丢弃24位来将它们转换为一个字节。 - ahmd0
5个回答

10

如何这样做:

byte[] byteArray = uintArray.SelectMany(BitConverter.GetBytes).ToArray();

这将以小端格式执行您想要的操作...


实际上,这个可以工作。SelectMany 会为您执行迭代,但它会获取每个 int 的所有四个字节。不过,它没有提供一个简单的解决方案来进行转换。 - Random832
@Random832 BitConverter.GetBytes 以任何方式返回每个 uint 的 4 个字节。请参阅 msdn 上的示例 http://msdn.microsoft.com/en-us/library/1184xdy4.aspx - hazzik
1
这个写法可能很优雅,但不是最快的解决方案... 为了获得最佳性能,你应该使用 buffer.blockcopy。 - Ben Childs

6
你可以使用System.Buffer.BlockCopy来实现这一点:
byte[] byteArray = new byte[uintArray.Length * 4];
Buffer.BlockCopy(uintArray, 0, byteArray, 0, uintArray.Length * 4];

http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx

使用此方法将比使用for循环或类似结构更加高效。它直接从第一个数组中复制字节到第二个数组中。

要转换回来,只需以相反的方式执行同样的操作即可。


3

没有内置的转换函数来完成这个操作。由于数组的工作方式,需要分配一个全新的数组,并填充其值。您可能需要自己编写代码来完成这一操作。您可以使用 System.BitConverter.GetBytes(uint) 函数来完成部分工作,然后将结果复制到最终的 byte[] 中。

以下是一个以小端格式进行转换的函数:

    private static byte[] ConvertUInt32ArrayToByteArray(uint[] value)
    {
        const int bytesPerUInt32 = 4;
        byte[] result = new byte[value.Length * bytesPerUInt32];
        for (int index = 0; index < value.Length; index++)
        {
            byte[] partialResult = System.BitConverter.GetBytes(value[index]);
            for (int indexTwo = 0; indexTwo < partialResult.Length; indexTwo++)
                result[index * bytesPerUInt32 + indexTwo] = partialResult[indexTwo];
        }
        return result;
    }

好的,谢谢。我想我需要遍历它们,并对uint[]数组中的每个值调用System.BitConverter.GetBytes(uint)。 - ahmd0
2
可以使用LINQ重写为byte[] byteArray = uintArray.SelectMany(o => BitConverter.GetBytes(o)).ToArray(); - Ilia G
@liho1eye - 是的,我喜欢那个解决方案。我特别喜欢这个事实,即如果您从 uint[] 更改为 short[]ulong[] 或任何其他类型,代码都不需要更改。 - Jeffrey L Whitledge

1
byte[] byteArray = Array.ConvertAll<uint, byte>(
    uintArray,
    new Converter<uint, byte>(
        delegate(uint u) { return (byte)u; }
    ));

请听@liho1eye的建议,确保您的uints真正适合于bytes,否则您将会丢失数据。


0
如果您需要从每个uint获取所有位,那么您需要创建一个适当大小的byte[],并将每个uint复制到它表示的四个字节中。
类似这样的代码应该可以工作:
uint[] uintArray;

//I need to convert from uint[] to byte[]
byte[] byteArray = new byte[uintArray.Length * sizeof(uint)];
for (int i = 0; i < uintArray.Length; i++)
{
    byte[] barray = System.BitConverter.GetBytes(uintArray[i]);
    for (int j = 0; j < barray.Length; j++)
    {
          byteArray[i * sizeof(uint) + j] = barray[j];
    }
}
cmd.Parameters.Add("@myBindaryData", SqlDbType.Binary).Value = byteArray;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接