2009-10-21 28 views
5

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

答えて

0

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

+0

メッセージオブジェクトであらかじめ配列を変換する必要があります。 – initialZero

+0

Jon、MiscUtilにEndianBitConverterがありませんか? – LBushkin

+1

@LBushkin:そうです、それが私の最初の考えでしたが、これは別の問題であるように思えます。 –

3

は、バイト配列内のシングルのためのエンディアンを変更するための高速な方法です。

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

私の16進数での入力が62,4d、00,4eであるとすると、出力は49,62,4e、00であるはずですが、これは16bitワードで作業している可能性があります。 SwapSinglesは私が必要としていない4e、00,4d、62を返します。 – initialZero

+0

@initialZero:Singleは4バイトです。だから、あなたはバイトを持っていないか、それともシングルを表していないのでしょうか? – Guffa

4

私は、LINQを使用します。あなたの心のコンテンツへ

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

あなたができるも.Skip().Take()、または他のBitConverterメソッドでインデックスを使用します。

+0

注意、 'Array.Reverse()'は古い方法です。 – Pat

+0

速い実装ですか?多分。実行時に高速?おそらくそうではありません。 – ulrichb

+0

@Pat Array.Reverseは元の配列を変更し、.Reverse()。ToArray()は新しい配列を作成します。大きな違い。それを行うための古いや新しい方法については何もありません。 – juFo

関連する問題