S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

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も同じ動作でした。