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[] 呢?

4

5 回答 5

9

怎么样:

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

这将以 little-endian 格式执行您想要的操作...

于 2011-11-07T04:24:00.487 回答
5

您可以使用 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 循环或一些类似的结构更有效。它直接将字节从第一个数组复制到第二个数组。

要转换回来,只需反过来做同样的事情。

于 2011-11-07T04:40:49.093 回答
3

没有内置的转换功能可以做到这一点。由于数组的工作方式,需要分配一个全新的数组并填充其值。你可能只需要自己写。您可以使用该System.BitConverter.GetBytes(uint)函数完成一些工作,然后将结果值复制到 final 中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;
    }
于 2011-11-07T04:22:54.920 回答
2
byte[] byteArray = Array.ConvertAll<uint, byte>(
    uintArray,
    new Converter<uint, byte>(
        delegate(uint u) { return (byte)u; }
    ));

注意@liho1eye 的建议,确保你的 uint 真的适合字节,否则你会丢失数据。

于 2011-11-07T04:23:05.263 回答
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;
于 2011-11-07T04:31:32.493 回答