2015-03-13 50 views
0

因为我发现在java中不可能有无符号字节,并且它们本质上占用了与int相同的内存,所以当你通过一个数据包发送它们时,真的有什么区别吗?Java中的字节缓冲区?

如果我通过(Games.RealTimeMultiplayer.sendReliableMessage)通过TCP或UDP 发送Java字节那会是对我不仅仅是发送一个整数,表示一个无符号字节更有益?

回答

3

因为我发现这是不可能具有无符号字节的Java

这是不正确。有很多方法。你甚至可以使用byte来表示一个无符号字节。您只需要在需要它的地方执行映射;例如

byte b = ... 
    int unsigned = (b >= 0) ? b : (b + 256); 

...这基本上是他们采取了相同的内存为int。

这也是不正确的。对于byte变量或字段而言是如此。但是,byte阵列中的字节占用int阵列中整数空间的1/4。

...当你通过一个数据包发送它们真的有什么区别吗?

好的。通过网络发送的byte(以自然方式)通过网络发送的int占用1/4位数。如果您以32位发送“8位数量”,则会浪费网络带宽。

+0

谢谢我希望这是真的。我只是在阅读这篇文章后对此持怀疑态度:http://stackoverflow.com/questions/14531235/in-java-is-it-more-efficient-to-use-byte-or-short-instead-of-int -and-浮-INST。因此,声明'所以当你声明一个局部变量或对象字段为一个字节时,变量/字段将存储在一个32位单元中,就像一个int .'一样。我和其他几篇文章一起阅读了这篇文章,觉得很尴尬。你能稍微解释一下'字节数组中的字节占用1/4吗',这是否意味着字节实例与数组中的字节不同? – Andrew 2015-03-13 15:57:08

+0

对不起,你感觉很沮丧。但是,这些都是FACTS,我甚至可以找到支持这一点的JVM规范的相关部分。 – 2015-03-13 22:44:47

+0

JVMS 2.5。和2.6介绍了如何在栈帧中保存变量。其余的是(AFAIK)实现特定的。然而,AFAIK中,所有的Java实现都使用一个32位字来保存一个字节变量,并将一个字节[]中的每个32位字包装为4个字节。 – 2015-03-13 22:59:56