【发布时间】:2019-05-24 06:56:55
【问题描述】:
我有一个byte[ ] 数组。我如何连接每 2 个字节(为每个人获得 16 位短尺寸值)并转换为 int?
我正在使用 for 循环进行转换,但我的字节数组很长,所以 for 循环让它变慢了。
例如:
字节数组如:{0x00, 0x01, 0x01, 0x02, 0x03, 0x04}
我想连接每 2 个字节,如下所示:{0x0001, 0x0102, 0x0304}
然后得到一个int[]数组,像这样:{ 1, 258, 772 }等等……
简而言之,通过连接两个字节获得短尺寸(16 位)值,然后将其转换为 int。
这就是我现在的方式,但它很慢:
byte[] buffer; // This is my byte array
int[] intBuffer = new int[buffer.length / 2];
for(int i = 0; i < buffer.length-1; i+=2){
intBuffer[i/2] = ((buffer[i] << 8) | buffer[i+1]);
}
我可以通过使用 Java 库来加快这个过程吗?
谢谢。
【问题讨论】:
-
您不太可能使其更快。无论您使用什么库,都可能会在内部做同样的事情。如果您的应用程序允许,另一种选择是懒惰地执行此操作。具体来说,有一些
intBufferGet(i)函数将返回(buffer[2*i] << 8) | buffer[2*i+1]。这样您就不必预先计算所有intBuffer。这是否会起作用/帮助取决于应用程序。 -
感谢@arshajii,但我每次都需要完整的数组。实际上,这个字节数组是流的一部分,我需要不断地将它转换为 int 数组。
-
你可以用一个可以转换为 ShortBuffer 的 ByteBuffer 来包装它。这一次读取两个字节并避免移位。如果您需要更快,您可能会使用 Unsafe。
-
我可以使用
ByteBuffer.wrap(buffer).asShortBuffer()获得 ShortBuffer 和 short[ ] 数组。这给了我 ShortBuffer,但我仍然需要 int[] 用于图像处理。我首先从您那里听说了 Unsafe,我看了一点,但不知道在数组操作中使用它。感谢您的建议@PeterLawrey。
标签: java arrays int byte short