2015年1月8日木曜日

C#でbyte列をfloatに変換する

C#ではBitConvertを使用することによりintやfloat等をbyte列に変換することができます
同じようにバイト列をintに変換することも可能です

が、なぜかバイト列をfloatに変換することは不可能です 実に不思議です

とりあえず必要なら何らかの方法で実装する必要があるので、とりあえず試しに実装してみました

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 件のコメント:

コメントを投稿