5

ビッグエンディアンのバイナリストリームから読み取っています。BitConverterクラスはこれを自動的に行います。残念ながら、必要な浮動小数点変換はBitConverter.ToSingle(byte [])と同じではないため、同僚からの独自のルーチンがあります。ただし、入力byte[]はリトルエンディアンである必要があります。byte[]配列のエンディアンを変換する高速な方法はありますか。もちろん、各バイトを交換することはできますが、トリックが必要です。ありがとう。

4

3 に答える 3

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++;
    }
  }
}
于 2009-10-21T20:23:49.033 に答える
3

LINQを使用します:

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

.Skip()また、.Take()心ゆくまで、またはBitConverterメソッドでインデックスを使用することもできます。

于 2010-03-18T22:54:04.443 に答える
0

あなたの同僚からのルーチンはどのように見えますか?バイトに明示的にアクセスする場合は、バイトを逆にする代わりに、コードを変更する(つまり、ビッグエンディアンデータ用に別のメソッドを作成する)ことができます。

于 2009-10-21T20:12:47.630 に答える