簡體   English   中英

如何將許多小整數存儲到字節數組中?

[英]How to store many small integers into a byte array?

我正在制作一個在線游戲,就像在許多在線游戲中一樣,我需要通過互聯網傳輸大量數據,因此我需要能夠有效地壓縮數據。

例如,我想從我的客戶端向服務器發送我的角色坐標。

編輯:是的,不好的例子,讓我更改值...

X坐標(例如-32至32)。(65個可能的值)Y坐標(-32至32)。(65個可能的值)Z坐標(-16至16)。(33個可能的值)

我知道X在發送之前存儲在Y之前,在字節數組上存儲在Z之前。

我知道在服務器中X不能小於-31或大於32,其他值相同。

65 * 65 * 33 = 139.425 3個數字= 17位的值的不同可能組合。

7 + 7 + 5 = 19位。

因此,如果我要在前7位中存儲X,然后在接下來的7位中存儲Y,然后在接下來的5位中存儲Z,則將需要19位,並且我能夠輕松地在另一側讀取它們,但是由於這3個數字可以取值的所有可能組合,只需要17位即可存儲,我感覺自己在這里失去了空間。 有沒有一種好的方法來使用少於19位壓縮這3個數字?

當然19位和17位都需要3個字節,但是如果分別是17位和15位,則將產生很大的差異。

我相信您所追求的是編碼算法,而不是壓縮算法。 要壓縮這些數字,您應該了解有關這些數字的一些其他信息。

對於編碼算法:您有65 * 65 * 33 = 139.425個不同的可能值。 Log2(139.425)〜17.09,因此至少需要18位才能對這些可能的值進行編碼。 一個簡單的編碼方案就像您說的那樣:

Value = Z*65*65 + Y*65 + X

然后對其進行解碼:

X = Value % 65
Y = (Value/65) % 65
Z = (Value/65/65) % 33

現在,Value是一個整數。 如果要將其存儲在字節數組中,可以將該整數分成3個字節:

Byte1 = Value & 255;
Byte2 = (Value>>8) & 255;
Byte3 = (Value>>16) & 255;

許多語言都支持位打包,但是我看不到這里的優勢。 每個值都小於一個字節,並且無論是否打包它們都需要相同數量的字節,因此您也可以節省打包/解壓縮值並僅解壓縮它們所花費的少量時間。

您可以看看gelasia-compacter

這是一個實用程序,它將一個數字序列打包在一個字節數組上,以使較小的數字占用更少的空間(並且這些數字可以長達很長,因此您不必在特殊情況下就非常大數字),它也有一種解壓縮它們的方法,該方法旨在與字節流一起使用(我的意思是,數據可以分成很多部分)。

當使用很多小數字時,這非常好,並且可以表示非常大的數字,但是如果數字太接近預期的int類型的大小,則可能會降低效率。

Google的協議緩沖區中使用了可變整數壓縮。 它稱為varint ,非常簡單。

http://code.google.com/apis/protocolbuffers/docs/encoding.html#varints

我發現這種使用壓縮的BitSet 變體 ,您應該看一下。 作者聲稱該算法針對查詢速度而非空間進行了優化,但始終比Java的BitSet類具有更高的空間利用率。 我認為,如果通過導線發送大量的坐標,則與僅將位序列化為BitSet然后轉換為byte []相比,可能會看到改進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM