Hay*_*ers 0 javascript compression
我需要在尽可能少的数据中将以下内容转换为二进制格式(以后再补偿).
my_arr = [
[128,32 ,22,23],
[104,53 ,21,25],
[150,55 ,79,23],
[104,101,23,8 ],
[57 ,117,13,21],
[37 ,135,21,20],
[81 ,132,23,6 ],
[81 ,138,7 ,8 ],
[97 ,138,7 ,8 ]...
Run Code Online (Sandbox Code Playgroud)
数字不超过399
如果我为每个数字使用0(连续8个0 = 8)和1作为分隔符,则第一行看起来像这样:010010000000011000100110010011001000这对于像99这样的数字来说真的很长
如果我将每个数字填充为三位数并将每个数字依次转换为实际二进制数,则第一行如下所示:000100101000000000110010000000100010000000100011这个数字为12个字符.
由于第一个字母不会是4或更高,我可以通过将0视为00,将1视为01,将2视为10和将3视为11来节省两个数字.因此,每个数字10个字符总体而言,这会将大小减小到大约90%的第一个选项(平均)但是有一个更短的方式?
编辑:是一个1和0的字符串...它不需要比原始整数短......只用最短的方式只用2个符号写它
如果值均匀分布在0和399之间,那么一个相当不错的编码将采用三个值并将它们编码为基本400三位整数.即val1 + 400*val2 + 400*400*val3.然后该整数将很好地适合26位.四个连续的26位值将适合13个字节.然后,每个值平均得到13/12字节.
除非值的分布存在偏差,或者如果存在重复或相关性,否则这将与您能够做的一样好,在这种情况下,您可以更多地压缩它们.
要处理细节,可以使用编码序列中的字节数来确定值的数量,这可能不是三的倍数.如果它不是三的倍数,则最后将有一个或两个值,每个编码为9位.由于需要8位来从18位增加到26位以添加值,因此计数中没有歧义.