0

C# プログラム内で、8 文字の 16 進文字列として格納されている多くの値を float 値に変換する必要があります。コードは 1 秒間に最大 50,000 回呼び出されるため、パフォーマンスは非常に重要です。

機能に関しては、Python コード:

f = struct.unpack('<f', bytes.fromhex(strng))[0]

私が必要とすることをします。「退屈な」バージョンを試しました:

byte[] raw = BitConverter.GetBytes(int.Parse(hex, NumberStyles.HexNumber));
Array.Reverse(raw);
float f = BitConverter.ToSingle(raw, 0);

しかし、これは恐ろしく遅いです。ここのコードを使用して最適化しようとしましたが 、これはテーブル ルックアップと C# ポインターを使用し、次のように呼び出します。

byte[] raw = FastHex.FromHexString(hex);
float f = BitConverter.ToSingle(raw, 0);

これは、hext から byte[] への変換には最適ですが、非ローカルの byte[] 配列の作成と破棄が必要です。FromHexString() コードの末尾にある byte[] から「float」値に直行できるかどうか疑問に思っています。つまり、次のことができるようになりたいです。

fixed (float* floatptr = (float*)result)
    return *floatptr;

ここで、result は結果を含む byte[4] ですが、C# はそれを好みません...もっと良い方法はありますか?

4

2 に答える 2

0
        // This works for a two byte string, possibly more ;-)
        string hex = "FF";
        //
        float f = (float) Convert.ToInt32(hex, 16);
        //
        // f is now 255, yahoo!
于 2013-02-07T13:04:06.190 に答える
0

これでうまくいくと思います:

float f = (float)System.Net.IPAddress.NetworkToHostOrder(
    BitConverter.ToInt32(bytes, 0));
于 2013-02-05T23:56:05.097 に答える