2015-03-13 85 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