【问题标题】:C# convert from uint[] to byte[]C# 从 uint[] 转换为 byte[]
【发布时间】:2011-12-23 09:02:49
【问题描述】:

这可能是一个简单的方法,但我似乎找不到一种简单的方法来做到这一点。我需要将 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[]?

【问题讨论】:

  • 这些值是否在有效字节范围内?
  • 不,伙计们,我需要将每个 uint 分解为 4 个字节,而不仅仅是通过丢弃 24 位将它们转换为一个字节))

标签: c# byte bytearray uint32


【解决方案1】:

怎么样:

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

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

【讨论】:

  • 其实这个可以。 SelectMany 会为您进行迭代,但它将获得每个 int 的所有四个字节。但是,它并没有为您提供一个简单的解决方案来将其转换回来。
  • @Random832 BitConverter.GetBytes 以任何方式返回每个 uint 4 个字节。请参阅 msdn msdn.microsoft.com/en-us/library/1184xdy4.aspx 上的示例
  • 这可能很优雅,但它不会是最快的解决方案......你应该真正使用 buffer.blockcopy 以获得最佳性能。
【解决方案2】:

您可以使用 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)。
    • 可以使用 LINQ 重写为byte[] byteArray = uintArray.SelectMany(o =&gt; BitConverter.GetBytes(o)).ToArray();
    • @liho1eye - 是的,我喜欢这个解决方案。我特别喜欢这样一个事实,即如果您从 uint[] 更改为 short[]ulong[] 或其他任何内容,则无需更改代码。
    【解决方案4】:
    byte[] byteArray = Array.ConvertAll<uint, byte>(
        uintArray,
        new Converter<uint, byte>(
            delegate(uint u) { return (byte)u; }
        ));
    

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

    【讨论】:

      【解决方案5】:

      如果您需要每个 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        • 2018-03-25
        • 1970-01-01
        • 2020-02-03
        • 2016-01-29
        相关资源
        最近更新 更多