繁体   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