Быстрый способ поменять байты в массиве с прямым порядком байтов на младший в C # - PullRequest
5 голосов
/ 22 октября 2009

Я читаю из двоичного потока, который находится в порядке байтов. Класс BitConverter делает это автоматически. К сожалению, нужное мне преобразование с плавающей запятой не совпадает с BitConverter.ToSingle (byte []), поэтому у меня есть своя собственная подпрограмма от коллеги. Но входной байт [] должен быть в порядке байтов. У кого-нибудь есть быстрый способ преобразования порядка байтов массива byte []. Конечно, я мог бы поменять местами каждый байт, но тут должен быть трюк. Спасибо.

Ответы [ 3 ]

4 голосов
/ 22 октября 2009

Вот быстрый метод изменения порядка байтов для синглов в массиве байтов:

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++;
    }
  }
}
3 голосов
/ 19 марта 2010

Я использую LINQ:

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

Вы также можете .Skip() и .Take(), если хотите, или использовать индекс в методах BitConverter.

0 голосов
/ 22 октября 2009

Как выглядит рутина вашего коллеги? Если он обращается к байтам явно, вы можете изменить код (или, скорее, создать отдельный метод для данных с прямым порядком байтов) вместо обращения байтов.

...