byte⇔float、byte⇔double変換する
実際のデータエリアには、浮動小数点のデータもあるようなので。
先日のbyte⇔int変換するで作ったByteUtilクラスを拡張して、というか利用して実現する。
実際は「Float#intBitsToFloat」を使えば、intのビット値をそのままfloatに変換してくれるので、4バイトのデータ変換をbyte→int→floatという形で実現する。
float f = Float.intBitsToFloat(ByteUtil.toInt(bytes));
逆は「Float#Float.floatToRawIntBits」を使って、float→int→byteに変換という感じ。
byte[] bytes = ByteUtil.toByte(Float.intBitsToFloat(f));
doubleはlongを経由してbyteと変換
「Double#longBitsToDouble」「Double#doubleToRawLongBits」で実現できる。
同じ要領で、doubleは8バイトなので、intではなくlongを経由する。
これもByteUtilに、オーバーロードでintじゃなくてlongでハンドリングするようなメソッド作ればOK。
Integer.toBinaryStringの謎仕様
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(-1f))); System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(256f)));
の結果
10111111100000000000000000000000
1000011100000000000000000000000
が返ってくる…符号ビットが0の場合、31バイトになってるw
案の上Long.toBinaryStringも同じ動作でした。