[英]How to convert a float into a byte array and vice versa?
I am trying to convert a float
into a primitive byte[]
and vice versa: 我试图将float
转换为原始byte[]
,反之亦然:
public byte[] floatToByteArray(final float value)
{
return new byte[]
{
(byte) (value >> 56),
(byte) (value >> 48),
(byte) (value >> 40),
(byte) (value >> 32),
(byte) (value >> 24),
(byte) (value >> 16),
(byte) (value >> 8),
(byte) (value)
};
}
Oddly enough, when I try to shift the newly allocated byte[]
back into a float
, the result is nothing but rubbish. 奇怪的是,当我尝试将新分配的byte[]
移回float
,结果只不过是垃圾。
However, it would appear as if the same algorithm works just fine when I use the primitive long
data type as argument instead. 但是,当我使用原始long
数据类型作为参数时,看起来好像相同的算法工作正常。
public byte[] longToByteArray(final long value)
{
return new byte[]
{
(byte) (value >> 56),
(byte) (value >> 48),
(byte) (value >> 40),
(byte) (value >> 32),
(byte) (value >> 24),
(byte) (value >> 16),
(byte) (value >> 8),
(byte) (value)
};
}
Use these instead. 请改用它们。
public static byte [] long2ByteArray (long value)
{
return ByteBuffer.allocate(8).putLong(value).array();
}
public static byte [] float2ByteArray (float value)
{
return ByteBuffer.allocate(4).putFloat(value).array();
}
Just to add another useful one based on @shazin solution. 只是为了添加另一个基于@shazin解决方案的实用工具。 Convert a float array into a byte array: 将float数组转换为字节数组:
public static byte[] FloatArray2ByteArray(float[] values){
ByteBuffer buffer = ByteBuffer.allocate(4 * values.length);
for (float value : values){
buffer.putFloat(value);
}
return buffer.array();
}
It wont work. 它不会工作。 Float.byteValue just truncates float value to 1 byte Float.byteValue只是将浮点值截断为1个字节
public byte byteValue() {
return (byte)value;
}
Besides, it's not clear what bytes you want. 此外,还不清楚你想要的字节数。 Is it IEEE 754 floating-point single-float bit layout? 它是IEEE 754浮点单浮点位布局吗? Then you can first convert it to int 然后你可以先将它转换为int
int i = Float.floatToIntBits(1.1f); // see Float API, there are actually 2 options
then use shifts to break it into 4 bytes or 8 bytes like you did 然后使用shift将其分解为4个字节或8个字节,就像你一样
Also based on Shazin solution, with additional specification on byte order: 同样基于Shazin解决方案,还有关于字节顺序的附加规范:
ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putFloat(value).array();
or 要么
ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putFloat(value).array();
I cant see easy-to-use methods. 我看不到易于使用的方法。 It works: 有用:
public static byte[] toByteArray(float value) {
byte[] bytes = new byte[4];
ByteBuffer.wrap(bytes).putFloat(value);
return bytes;
}
public static float toFloat(byte[] bytes) {
return ByteBuffer.wrap(bytes).getFloat();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.