开发者

Fast way to swap bytes in array from big endian to little endian in C#

开发者 https://www.devze.com 2022-12-08 22:17 出处:网络
I\'m rea开发者_运维知识库ding from a binary stream which is big-endian. The BitConverter class does this automatically. Unfortunately, the floating point conversion I need is not the same as BitConver

I'm rea开发者_运维知识库ding from a binary stream which is big-endian. The BitConverter class does this automatically. Unfortunately, the floating point conversion I need is not the same as BitConverter.ToSingle(byte[]) so I have my own routine from a co-worker. But the input byte[] needs to be in little-endian. Does anyone have a fast way to convert endianness of a byte[] array. Sure, I could swap each byte but there has got to be a trick. Thanks.


Here is a fast method for changing endianess for singles in a byte array:

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++;
    }
  }
}


I use LINQ:

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

You can also .Skip() and .Take() to your heart's content, or else use an index in the BitConverter methods.


What does the routine from your co-worker look like? If it accesses the bytes explicitly, you could change the code (or rather, create a separate method for big-endian data) instead of reversing the bytes.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号