Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是已知的二进制格式,还是自制的?_C#_Arrays_Compression_Binary Serialization - Fatal编程技术网

C# 这是已知的二进制格式,还是自制的?

C# 这是已知的二进制格式,还是自制的?,c#,arrays,compression,binary-serialization,C#,Arrays,Compression,Binary Serialization,我目前正在解码一个二进制文件格式,我们使用它对包含的数据进行一些内部分析。它主要存储整数或双精度数组,使用某种压缩算法存储这些数组。当我逆向工程他们的压缩算法时,我开始怀疑我是否在重新发明轮子。这是一个众所周知的压缩算法,我甚至可以找到一个现有的C#库来进行读写,还是完全是自制的 以下是一些例子: [5, 0, 1, 2, 3, 4, 5] => [1, 2, 3, 4, 5] [255, 128, 31] => [31, 31, 31, ..., 31, 31, 31] // (a

我目前正在解码一个二进制文件格式,我们使用它对包含的数据进行一些内部分析。它主要存储整数或双精度数组,使用某种压缩算法存储这些数组。当我逆向工程他们的压缩算法时,我开始怀疑我是否在重新发明轮子。这是一个众所周知的压缩算法,我甚至可以找到一个现有的C#库来进行读写,还是完全是自制的

以下是一些例子:

[5, 0, 1, 2, 3, 4, 5] => [1, 2, 3, 4, 5]
[255, 128, 31] => [31, 31, 31, ..., 31, 31, 31] // (an array of 255 31's)
字节
[1,0,31]
编码整数数组
[31]
。第一个字节(1)表示数组由一个数字组成。第二个字节(0)表示数字被一一列出。第三个字节(31)是列出的数字。(只要小于255,它就被写为一个字节。)

字节
[1,128,31]
编码相同的数组,但是第二个字节(128)意味着下一个字节应该重复一次(第一个字节)。这允许我们通过将序列相同的数字列为一个来压缩数组,例如对数组进行编码的
[5128,31]

还有一些例子:

[5, 0, 1, 2, 3, 4, 5] => [1, 2, 3, 4, 5]
[255, 128, 31] => [31, 31, 31, ..., 31, 31, 31] // (an array of 255 31's)
当数组长度大于255时,它将以256的倍数添加到第二个字节

[5, 1, 31] => [31, 31, 31, ..., 31, 31, 31] // (an array of 5 + 256*1 = 261 31's)
这适用于普通阵列和重复阵列:

[5, 1, 1, 2, 3, 4, 5, ..., 260, 261] => [1, 2, 3, ..., 260, 261] // (an array with the numbers from 1 to 261)
当数组中的任何数字大于255时,这些数字将被拆分为256的因子

[1, 0, 4, 1, 0, 3] => [4 + 256 * 3] => [772]
[3, 0, 4, 17, 0, 3, 128, 2] => [4 + 256*2, 17 + 256*2, 0 + 256*2] => [516, 529, 512]
还有一些更复杂的问题,特别是双打,但我想这足以让任何知道这种格式的人认识到它


有人认识这种二进制序列化/压缩方法吗?它有名字吗?有没有使用这种技术的C#库?

你问过计算机科学SE吗?没有。这更相关吗?如果是这样,我应该从这里删除它,还是将它保留在两个位置?这是一种运行长度编码形式。虽然我不理解128的内容,因为你说这意味着下面的字节按原样重复。那么[5,0,31]和[5128,31]之间的区别是什么,因为这两个词的意思都是[31,31,31,31,31]。@ckuri:谢谢![5,0,31]是[31],而[5,128,31]是[31,31,31,31],因为第二个字节小于128意味着将直接列出这些字节,而不是列出一次并重复5次。但是这些将编码相同的数组:[5,0,31,31,31,31,31]和[5,128,31]。你问过计算机科学SE吗?没有。这更相关吗?如果是这样,我应该从这里删除它,还是将它保留在两个位置?这是一种运行长度编码形式。虽然我不理解128的内容,因为你说这意味着下面的字节按原样重复。那么[5,0,31]和[5128,31]之间的区别是什么,因为这两个词的意思都是[31,31,31,31,31]。@ckuri:谢谢![5,0,31]是[31],而[5,128,31]是[31,31,31,31],因为第二个字节小于128意味着将直接列出这些字节,而不是列出一次并重复5次。但它们将编码相同的数组:[5,0,31,31,31,31,31]和[5128,31]。