目标是将每对字节转换为单个无符号 16 位 int。在 CI 中将定义一个 16 位 unsinged int 指针的数组 [500] 并将其指向字节数组,但在 java 中我不知道这样的捷径。我知道在 Java 中除了 char 之外没有 16 位数据类型,但这不是问题。我们只需要将每两个连续的两个字节复制到一个整数数组的单个 int 中。因此整数数组保存的 int 值范围从 0 到 65535 (2^16-1)。
问问题
1892 次
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 个元素来说可能不值得,除非它做了很多。)请注意,从byte
to的提升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 回答