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 となります。