C#从uint[]转换为byte[]
本文关键字:byte 转换 uint | 更新日期: 2023-09-27 18:13:44
这可能是一个简单的方法,但我似乎找不到简单的方法。我需要将一个包含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[]呢?
怎么样:
byte[] byteArray = uintArray.SelectMany(BitConverter.GetBytes).ToArray();
这将以小端序格式执行您想要的操作。。。
您可以使用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循环或一些类似的构造更有效。它直接将字节从第一个数组复制到第二个数组。
要转换回来,只需反过来做同样的事情。
没有内置的转换函数可以实现这一点。由于数组的工作方式,需要分配一个全新的数组并填充其值。你可能只需要自己写。您可以使用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;
}
byte[] byteArray = Array.ConvertAll<uint, byte>(
uintArray,
new Converter<uint, byte>(
delegate(uint u) { return (byte)u; }
));
听从@liho1eye的建议,确保你的uint真的适合字节,否则你会丢失数据。
如果你需要每个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;