2

目标是将每对字节转换为单个无符号 16 位 int。在 CI 中将定义一个 16 位 unsinged int 指针的数组 [500] 并将其指向字节数组,但在 java 中我不知道这样的捷径。我知道在 Java 中除了 char 之外没有 16 位数据类型,但这不是问题。我们只需要将每两个连续的两个字节复制到一个整数数组的单个 int 中。因此整数数组保存的 int 值范围从 0 到 65535 (2^16-1)。

4

3 回答 3

4

您可以使用 ByteBuffer 来避免经常出错的移位和屏蔽。(并且也有签名与未签名)

ByteBuffer bb = ByteBuffer.wrap(bytes);
bb.order(ByteOrder.BIG_ENDIAN);  // or LITTLE_ENDIAN
short[] shorts = new short[bytes.length/2];
for (int i=0; i<shorts.length; i++)
   shorts[i] = bb.getShort();

注意 - 如果你真的想要一个“无符号短”,java中没有这样的东西,所以你的数组必须是整数。你会转换使用

for (int i=0; i<intArray.length; i++) {
   short s = bb.getShort();
   intArray[i] = s & 0xFFFF; // mask off all the high order bits
}
于 2012-01-19T19:28:03.223 回答
2

我认为在 Java 中没有像在 C 中可以做的别名那样好的技巧。你将不得不手动完成:

public int[] pack(byte[] bytes) {
    int n = bytes.length >> 1;
    int[] packed = new int[n];
    for (int i = 0; i < n; ++i) {
        int i2 = i << 1;
        int b1 = bytes[i2] & 0xff;
        int b2 = bytes[i2 + 1] & 0xff;
        packed[i] = (b1 << 8) | b2;
    }
    return packed;
}

(这可能会加快一点速度,但对于 1,000 个元素来说可能不值得,除非它做了很多。)请注意,从byteto的提升int需要一些额外的工作来处理不需要的符号扩展。

于 2012-01-19T19:15:47.767 回答
1

Java 中并没有真正的无符号 16 位整数类型——除非 char对这种语言感到辱骂。也就是说,这是使用流行的Guava实用程序库的好时机:

public short[] pack(byte[] bytes) {
   short[] result = new short[bytes.length / 2];
   for (int i = 0; i < bytes.length; i += 2) {
     result[i/2] = Shorts.fromBytes(bytes[i], bytes[i+1]);
   }
}

如果你真的对性能很挑剔,你可以添加一个单独的计数器或使用右移而不是除法,但这很简单。

于 2012-01-19T19:48:10.247 回答