高效地将float数组转换为字节数组

时间:2014-05-22 12:45:48

标签: java arrays casting

以前这个问题可能已被问到,但我找不到完全匹配,所以我会尝试一下。

我想将float[]投射到byte[],方式是投放一个float(丢失信息等),这意味着我只想保留最后8位数组中的每个float。我找到了一些涉及ByteBuffer的代码,但是这种方法将每个浮点数的所有32位转换为4个字节(每个8位),这不是所需的输出(如果有人感兴趣,链接是http://www.javalobby.org/java/forums/t18962.html

我没有找到任何代码,所以我只使用了经典的for循环:

public static byte[] float2ByteArray(float floatArray[]) {
    byte[] byteArray = new byte[floatArray.length]; 
    for(int i = 0; i < floatArray.length; i++) {
        byteArray[i] = (byte) floatArray[i];
    }
    return byteArray;
} 

我的问题是,是否有更有效的方法来达到我不知道的相同结果?

1 个答案:

答案 0 :(得分:1)

循环的一般方法是要走的路。人们可能会修改循环结构(展开等)以获得几个百分点更好的性能,但这通常是您在功能开发的最后阶段(如果有的话)只需要打扰的事情。

这里更多的问题是你没有检查浮动是否适合成一个字节。由于数据类型小于int的操作的java(有点特殊)语义,强制转换:

byte b = (byte) floatValue;

当浮点值超出字节范围时,可能会导致非常丑陋的惊喜。因为隐式地这种转换如下:

int i = (int) floatValue;
byte b = (byte) i;

不是你会直觉所期望的。如果floatValue 符合到int而不是字节,则最终的字节值将是截断的 int值。例如:

float f = 256F;
byte b = (byte) f;

结果是字节值为0(),而不是人们通常期望的127。请注意这一点,并在投射前相应地舍入/剪切浮动值。

就性能而言,浮动 - &gt; int / byte cast是迄今为止最昂贵的操作(每个元素)。