在对float类型数据做持久化过程中需要将float转化成byte[] 类型的数据。最简单的办法是将float类型的数据转化成String,然后调用String的getBytes()方法就行了。但是使用这个方式存储的数据占用的磁盘空间更大,一般需要6个字节,而且随着精度越过占用的字节数也越大。
更好的办法是用是先将浮点数转化成int类型,然后将int类型转化成byte[] 数组保存,这样保存的字节长度恒定为4个字节。代码如下:float fvalue= 1.20004f;
byte[] data = byte[4]; int ivalue = Float.floatToIntBits(fvalue); data[0] = (byte)(ivalue >> 24); data[1] = (byte)(ivalue >> 16); data[2] = (byte)(ivalue >> 8); data[3] = (byte) ivalue; return data;
这个操作使用了左移动操作来将int赋值给长度为4的int数组。
如果要将byte[4] 转化为float,可以执行以下操作:
int ivalue = ((data[0] & 0xFF) << 24) | ((data[1] & 0xFF) << 16) | ((data[2] & 0xFF) << 8) | (data[3] & 0xFF); System.out.println(Float.intBitsToFloat(ivalue));
long 和byte[]的相互转换:
long -> byte[]:
static byte[] toArray(long val) { int off = 0; byte[] b = new byte[8]; b[off + 7] = (byte) (val >>> 0); b[off + 6] = (byte) (val >>> 8); b[off + 5] = (byte) (val >>> 16); b[off + 4] = (byte) (val >>> 24); b[off + 3] = (byte) (val >>> 32); b[off + 2] = (byte) (val >>> 40); b[off + 1] = (byte) (val >>> 48); b[off + 0] = (byte) (val >>> 56); return b; }
byte[]->long
static long toLong(byte[] b) { int off = 0; return ((b[off + 7] & 0xFFL) << 0) + ((b[off + 6] & 0xFFL) << 8) + ((b[off + 5] & 0xFFL) << 16) + ((b[off + 4] & 0xFFL) << 24) + ((b[off + 3] & 0xFFL) << 32) + ((b[off + 2] & 0xFFL) << 40) + ((b[off + 1] & 0xFFL) << 48) + (((long) b[off + 0]) << 56); }