我是一名嵌入式工程师,使用Java工作。我需要与设备进行通信,并且经常需要按照某些硬件所需或由某些硬件生成的形式按摩缓冲区。
我花了相当多的时间搜索网络(和这个网站),寻找如何将字节缓冲区视为较大元素的缓冲区的答案。有很多回复,但它们总是归结为(1)使用ByteBuffer或(2)手动进行转换。
问题是,不需要转换......基础字节数组包含有效的短路,具有正确的字节序。我不希望将字节数组复制到相同的short数组。我想要做的就是说服Java编译器将它们视为我感兴趣的类型。
我对ByteBuffer没有很多经验,但我是第一条走下去的路。我发现如果我有一个ByteBuffer并且我调用它的asShortBuffer()函数,生成的ShortBuffer没有后备数组......我不能在它上面调用array(),这就是我需要的。
有什么想法吗?
答案 0 :(得分:1)
你真的需要一个ShortBuffer吗?为什么不直接使用ByteBuffer上的各种get / put方法从/向底层字节数组读取/写入short,int和其他值?
答案 1 :(得分:1)
我真的不知道你的用例,但问题并不意味着你实际上需要将整个字节数组转换为short / ints / longs数组(否则,ByteBuffer或manuall转换就可以了)。
如果你只需要将该数组中的任何值作为short / int / long处理,你需要做的就是分配它,并且upcast是隐式的:
int i = byteArray[x]; // works like a charm
以同样的方式,您可以将任何值传递给期望long
或其他任何不需要转换的方法。
编辑:
作为对您的注释的回复,只有在您能够使用对象包装器而不是基元时才能使用数组协方差(这意味着您可以控制您提到的方法中的代码):
// needs to be Number because Byte does not inherit from Short
myMethod(Number[] numbers) { // do something with number.shortValue() ...
您可以使用以下方式调用它:
myMethod(new Byte[10]);
但我认为这比将byte[]
转换为short[]
更不可接受。
答案 2 :(得分:0)
您可以简单地将批量get()用于现有数组,而不是使用ShortBuffer中的array()。同样可以应用于其他数据类型。
答案 3 :(得分:0)
如果你有bytebuffer并知道endainness,你可以随时生成short / int。你被困了,因为你想把它作为一组短路/整数来访问。