4

我是一名嵌入式工程师,使用 Java。我需要与设备通信,并且经常需要将缓冲区按摩成某些硬件需要或产生的形式。

我花了相当多的时间搜索网络(和这个站点)来寻找如何将字节缓冲区视为更大元素的缓冲区的答案。有很多响应,但它们总是归结为 (1) 使用 ByteBuffer 或 (2) 手动进行转换。

问题是,不需要转换......底层字节数组包含有效的短裤,具有正确的字节顺序。我不希望将字节数组复制到相同的短裤数组的费用。我要做的就是说服 Java 编译器将它们视为我感兴趣的类型。

我对 ByteBuffer 没有太多经验,但我是我走的第一条路。我发现如果我有一个 ByteBuffer 并且我调用它的 asShortBuffer() 函数,则生成的 ShortBuffer 没有后备数组......我不能在它上面调用 array() ,这是我需要的。

有什么想法吗?

4

4 回答 4

1

你真的需要一个 ShortBuffer 吗?为什么不直接使用 ByteBuffer 上的各种 get/put 方法从底层字节数组读取/写入 short、int 和其他值?

于 2013-06-20T20:30:08.790 回答
1

我真的不知道你的用例,但这个问题并不意味着你实际上需要将整个字节数组转换为一个 shorts / ints / longs 数组(否则,ByteBuffer 或手动转换就可以了)。

如果您只需要将该数组中的任何值视为 short/int/long,您需要做的就是分配它,upcast 将是隐式的:

int i = byteArray[x]; // works like a charm

同样,您可以将那里的任何值传递给期望 along或任何内容的方法,而无需进行强制转换。


编辑:

作为对您的评论的回应,只有当您负担得起使用对象包装器而不是原语时,您才能使用数组协方差(这意味着您可以控制您提到的方法中的代码):

// needs to be Number because Byte does not inherit from Short
myMethod(Number[] numbers) {   // do something with number.shortValue() ...

您可以使用以下方法调用它:

myMethod(new Byte[10]);

但我认为,这甚至比将 a 转换byte[]为 a更不可接受short[]

于 2013-06-20T20:31:49.717 回答
0

您可以简单地将批量get()用于现有数组,而不是从 ShortBuffer 执行 array() 。同样可以应用于其他数据类型。

于 2013-06-20T20:34:01.277 回答
0

如果你有字节缓冲区并且知道endainness,你可以随时生成shorts/ints。你被卡住了,因为你想把它作为一个短裤/整数数组来访问。

于 2013-06-20T20:43:30.030 回答