在C#中将数组中的字节从big endian交换到little endian的快速方法

时间:2009-10-21 20:09:35

标签: c# endianness

我正在读取一个big-endian的二进制流。 BitConverter类自动执行此操作。不幸的是,我需要的浮点转换与BitConverter.ToSingle(byte [])不同,所以我有一个同事的自己的例程。但输入byte []需要是little-endian。有没有人有一种快速的方法来转换byte []数组的字节顺序。当然,我可以交换每个字节,但必须有一个技巧。感谢。

3 个答案:

答案 0 :(得分:4)

这是一种在字节数组中更改单个字节的字节顺序的快速方法:

public static unsafe void SwapSingles(byte[] data) {
  int cnt = data.Length / 4;
  fixed (byte* d = data) {
    byte* p = d;
    while (cnt-- > 0) {
      byte a = *p;
      p++;
      byte b = *p;
      *p = *(p + 1);
      p++;
      *p = b;
      p++;
      *(p - 3) = *p;
      *p = a;
      p++;
    }
  }
}

答案 1 :(得分:3)

我使用LINQ:

var bytes = new byte[] {0, 0, 0, 1};
var littleEndianBytes = bytes.Reverse().ToArray();
Single x = BitConverter.ToSingle(littleEndianBytes, 0);

您也可以.Skip().Take()获取内容,或者使用BitConverter方法中的索引。

答案 2 :(得分:0)

你的同事的例行公事是什么样的?如果它显式访问字节,你可以改变代码(或者更确切地说,为big-endian数据创建一个单独的方法)而不是反转字节。