Well, 对于 text data, 我们 ing just a simple Huffman algorithm (very lightweight) can get you something in the 30% to 50% on average. Takes almost nothing both in 码 and data. Could be enough. Now if it'的纯二进制数据,这实际上取决于内容。
I'我不是在谈论压缩文本。一世'm在谈论使用文本作为减少数据量的一种方式。在二进制中,一个4字节的数字将始终占用4个字节。即使没有'如果更改,则是否可以压缩完全取决于周围的数据。假设您有一个包含6个4字节数字(总共24个字节)的二进制记录,我使用的文本格式如下:
1234;56473;587596;226;5859;492|
;;;;;|
1236;56472;;;;|
第一条记录已完成。在第二条记录中,没有任何变化,在第三条记录中,仅前两个字段已更改。总共使用52个字符而不是72个字节。将52个字符转换为4位(0..9和2个额外的字符作为字段分隔符和记录分隔符),您需要26个字节,压缩率超过60%。像任何压缩算法一样,实际压缩将取决于数据,但是如果您需要占用空间少且处理开销低的内容,那么这很简单& effective way.
@Martin F:我认为现有的压缩库将很难在微控制器上使用,因为您'将需要大量的内存(闪存和RAM)和堆。我一直在尝试压缩FPGA图像。
您正在利用其数据集中的一个特殊功能,该功能主要包含小数字,但有一些奇特的大离群值。当然,在这种情况下,使用ASCII所产生的额外开销可能比您实现的压缩少。
您可以通过许多其他方式来实现相同的想法,而无需使用ASCII(二进制),因此结果将更小。例如,这:
如果值为<65535,将其写成16位(2字节)。
如果值为>= 65535,首先写入65535(后面还有4个字节的标识符),然后再写入所有4个字节。结果,典型的"median"case将占用2个字节(而不是ASCII解决方案中的5个字节),最坏的情况将占用5个字节(而ASCII版本为11个字节)。
您的第一个6项数据集是全32位数字的24字节,ASCII表示形式的30字节(它已经增长,没有像您想的那样缩小),而在我建议的编码中为15字节。
您的数据量减少来自于"not changed"压缩。同样的二进制解决方案显然更小。
您仅通过保存更改的字段来应用时间压缩的想法是合理的,并且得到了广泛使用,但是我很难理解您如何将其归因于
使用ASCII,尤其是
XML格式-ism(您的编码显然不会't have, thank god)
请注意,在传感器读数嘈杂的情况下,这种简单的方案只有在'有关某些传感器比其他传感器采样更多的信息,以及您的日志记录方案迫使您进行等时写入。实际上,可以列出存在的值和不存在的值(而不是始终用逗号分隔所有内容)的记录器可能会更小。特别是如果您可以将数据ID设置为8位。
通常在车辆数据记录中,我'd推测,传感器的测量值落在很小的范围内,因此不需要32位值。这就是重新排列思想的线索:如果仍然解析数据,则可能能够将RPM设置为14位。如果你
发生 要具有仅包含1或2位的8位宽的标志字段,您可以将它们置于16位RPM值的始终为零的MSb中。但是,如果您只想将原始CAN数据流转储到卡上,则必须解析所有内容以进行重新排列,这可能是不必要的负担,即使是简单的通用压缩算法也可以解决您的麻烦,而无需进行大量定制工作。