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# はそれを好みません...もっと良い方法はありますか?