Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将底层字节数组视为短数组?还是ints?还是渴望?_Java_Arrays_Casting - Fatal编程技术网

Java 如何将底层字节数组视为短数组?还是ints?还是渴望?

Java 如何将底层字节数组视为短数组?还是ints?还是渴望?,java,arrays,casting,Java,Arrays,Casting,我是一名嵌入式工程师,在Java中工作。我需要与设备通信,并且经常需要将缓冲区转换为某些硬件所需或产生的形式 我花了相当长的时间搜索网络(和这个站点),寻找如何将字节缓冲区视为较大元素缓冲区的答案。有许多响应,但它们总是归结为(1)使用ByteBuffer或(2)手动进行转换 问题是,不需要转换。。。基础字节数组包含有效的短字符,具有正确的尾数。我不想把一个字节数组复制到一个相同的短数组。我只想说服Java编译器将它们视为我感兴趣的类型 我对ByteBuffer没有太多的经验,但我认为这是我走的

我是一名嵌入式工程师,在Java中工作。我需要与设备通信,并且经常需要将缓冲区转换为某些硬件所需或产生的形式

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

问题是,不需要转换。。。基础字节数组包含有效的短字符,具有正确的尾数。我不想把一个字节数组复制到一个相同的短数组。我只想说服Java编译器将它们视为我感兴趣的类型

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


有什么想法吗?

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

我不知道您的用例,但问题并不意味着您实际上需要将整个字节数组转换为short/int/long数组(否则,ByteBuffer或manuall转换将正常)

如果只需要将该数组中的任何值视为short/int/long,则只需将其赋值,向上转换将是隐式的:

int i = byteArray[x]; // works like a charm
同样,您可以将其中的任何值传递给一个方法,该方法需要
long
或其他任何类型的值,而不需要强制转换


编辑:

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

您可以使用以下命令来调用它:

myMethod(new Byte[10]);


但我想,这比将
字节[]
转换为
短[]
更难接受。

而不是执行数组()从ShortBuffer,您可以简单地将一个大容量应用到现有的数组中。同样,也可以应用到其他数据类型。

如果您有bytebuffer并且知道Endains,您可以随时生成短/整数。您被卡住了,因为您希望将其作为短/整数数组进行访问。

同样,我不想从m数组…我希望能够将整个数组传递给一个需要一个短数组的函数。那么我恐怕你运气不好。如果你有什么理由想处理数组而不是ByteBuffer?direct ByteBuffer本质上是一个读取/写入一块非托管内存的接口。它与l非常接近低级C样式数组。我所处理的硬件对字节缓冲区一无所知;它需要值数组。但您使用的是Java。您是否将数组传递给外部本机代码?如果您将数组写入套接字,为什么不能只编写字节数组,而不管其中编码的值是什么?我认为唯一有意义的区别是nce将是长度,但您可以手动写入。很抱歉,不清楚。我有一个字节数组,需要将其传递给一个接受短数组的函数。我不想每次复制缓冲区…这不是一个完全零复制的系统,但我不希望引入完全不必要的副本。重新读取,不是吗他是一个有趣的观点,我没有意识到……谢谢。这对我解决这个问题没有什么帮助,但知道这一点很好。它的缺陷是它只使用数组值中的8位,而不是试图通过这个问题解决的整个16/32/64位。@Jiro117:我不确定我是否得到了这个:缺陷是……什么?啊,我是嗯,那就没什么用了。不过谢谢你的回答。我刚看了一眼大容量的get()函数。它表明正在执行复制操作。我拥有的缓冲区包含完全有效的内容,不需要任何转换或复制…如果我能让Java相信这一事实的话。它复制值,但避免分配新数组,因为它只会使用现有数组并覆盖其值。没有办法将字节数组视为不同类型的数组,因为它们是从对象类继承而来的不同类。是的,我意识到它们是不同的类…这正是我试图处理的问题。真的没有办法告诉Java数据是我知道的类型,而不是它认为的类型吗?不幸的是y、 Java不会允许您这样做。您不能将它们视为指向同一内存的两种不同类型。如果您希望将字节[]转换为短[],则在某个时候必须执行复制。即使您尝试将字节[]。类转换为短[].class你会得到一个ClassCastException。假设是这样的话——根据我所做的搜索,这正是我所期待听到的——有人知道有一个包有工具可以解决它吗?也许对JNI进行一个简短的研究,就足以传回一个不同的类型签名?我之所以一直在推它,是因为我可以声明cat从自我角度讲,有着与我类似需求的嵌入式工程师在处理无关拷贝方面做得并不好……在某些情况下,额外的数组拷贝是完全不可接受的。我是一名长期的C/C++程序员,我已经用Java密集编程4年了。我真的很喜欢它……大多数时候……但后来我遇到了一些问题像这样,或者说缺少无符号数据类型,这确实让Java成为一种嵌入式工作的尝试。除了使用ByteBuffer等,基本上你不能。除非你编写自己的JNI例程来实现你想要的。(不清楚为什么ByteB
myMethod(new Byte[10]);