[C#]int (float, double) と byte[] を変換

byte[] はデータのバイナリ化、通信、暗号化等々よく使われる型ですが、プログラムで実際に必要になるのは別の型である事が多いです。

使う度にググってる自分に気づいてしまったので、記事にしておくことにしました。
C# の記法なので、unity に限らず使えます。

unity 以外の方は、Debug.Log を Console.WriteLine に変更してください。

int (float, double) を byte[] にする

int number_int = 500;
byte[] byteArray_int = BitConverter.GetBytes(number_int);

float number_float = 300.012f;
byte[] byteArray_float = BitConverter.GetBytes(number_float);

double number_double = 100.01234;
byte[] byteArray_double = BitConverter.GetBytes(number_double);

// byte の中身をログに出力する
Debug.Log(BitConverter.ToString(byteArray_int));
Debug.Log(BitConverter.ToString(byteArray_float));
Debug.Log(BitConverter.ToString(byteArray_double));

数字を byte[] にすると、このように多くの桁を使って保存されているのがわかりますね。

byte[] を int (float, double) にする

byte を数値にする場合は、型によってそれぞれ呼び出すメソッドが異なります。

// 先ほどの byteArray を数値に戻す
int    result_int    = BitConverter.ToInt32(byteArray_int, 0);
float  result_float  = BitConverter.ToSingle(byteArray_float, 0);
double result_double = BitConverter.ToDouble(byteArray_double, 0);

Debug.Log(result_int);
Debug.Log(result_float.ToString("F3"));
Debug.Log(result_double.ToString("F5"));

きちんと値を戻せているのがわかるかと思います。
ToString("F3") は小数点の桁数を表示するための引数です。F が小数点、3 が小数点の桁数となっています。

(応用編)複数の int と byte[] のやりとり

実際は byte[] を細切れに管理する事は少なく、一まとめにする事も少なくありません。

byte[] byte_int1 = BitConverter.GetBytes(700);
byte[] byte_int2 = BitConverter.GetBytes(900);

// byte_int1 と byte_int2 を byte_cat にまとめる
byte[] byte_cat  = new byte[byte_int1.Length + byte_int2.Length];
Buffer.BlockCopy(byte_int1, 0, byte_cat, 0, byte_int1.Length);
Buffer.BlockCopy(byte_int2, 0, byte_cat, byte_int1.Length, byte_int2.Length);

Debug.Log(BitConverter.ToString(byte_cat));

// 第2引数で byte の読み出し位置を指定できる
int res_int1 = BitConverter.ToInt32(byte_cat, 0);
int res_int2 = BitConverter.ToInt32(byte_cat, 4);

Debug.Log(res_int1);
Debug.Log(res_int2);

静的型付け言語は嫌い、という人には目をそむけたくなるような内容ですが、結局コンピューターは byte しか理解しておらず、int、float、string といった嫌いな「型」は、byte を人間にわかりやすく表現してくれてるんだと言うことがわかると、ちょっと歩み寄ってみる気になるんじゃないでしょうか。

int は byte[] に直すと、必ず byte[4] のサイズになります。
それを利用して、ToInt32() の第2引数で読み出し位置を変えているのです。
BC - 02 - 00 - 00 が 700、84 - 03 - 00 - 00 が 900 となります。


返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA