BitConverter.ToSingleつかえ。
***
C#ではBitConvertを使用することによりintやfloat等をbyte列に変換することができます
同じようにバイト列をintに変換することも可能です
とりあえず必要なら何らかの方法で実装する必要があるので、とりあえず試しに実装してみました
using System; class Program { unsafe static float byte2float(byte[] data) { if (data.Length < 4) { return (float.NaN); } float f; ((byte*)&f)[0] = data[0]; ((byte*)&f)[1] = data[1]; ((byte*)&f)[2] = data[2]; ((byte*)&f)[3] = data[3]; return (f); } static void Main(string[] args) { Console.WriteLine(byte2float(BitConverter.GetBytes((float)(12.34)))); Console.ReadLine(); } }
この方法の問題点はunsafeを使用することです
つまり「危険な処理」を実行する必要があります
本来はやるべきではないですが、関数名でunsafeを宣言しないと危険な処理は許可されないので、可能な限り局所化することで妥協しています
内部でどういう処理がされているかはわかりませんが、ソースコードを見る限りでは最速の方法だと思います
このbyte2float関数では入力されたバイト列が4未満の場合はNaNを返しています
入力された値が本当にNaNなのか、入力自体が不正なのかを判定することはできません
本当のNaNはバイト列が固定なので、NaNが帰った場合はifで比較する というのもアリですが、おそらくTryBytes2Float関数を作って戻り値をbool、引数をbyte[]とout floatにする という感じで実装するほうがいいでしょう
以上、C#ならポインタも扱える!自由度高い!!という話でした
なんでポインタ使う必要があるって、標準で用意されてる機能では足りないからなんですけども…
0 件のコメント:
コメントを投稿