如何读取数组的c文件,在内存中映射成真正的数组

2020-01-01 17:48发布

介绍下问题提出背景,我的程序中有个90多k的数组,70%以上都是连续的0,我打算用rle算法压缩,估计降低一半以上大小是可行的

初步思路是搞个上位机的命令行程序,读取这个数组c文件,压缩后生成一个bin文件,mdk支持在编译前运行命令,然后mdk装载这个bin文件生成最后的程序文件,整个过程都会自动完成

现在事情还没开始就遇上一个麻烦事,如何读取数组c文件,因为这个3维数组使用嵌套大括号表示数组层次,连续的0其实都是没标出的,编译器当然明白这些,但是如果自己来做的话就要自己解析这个数组c文件到内存里,这个也不是一会儿功夫可以搞定的啊

请问谁有这方面的经验,或者有开源的库可以干这个活呢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
35条回答
myxiaonia
1楼-- · 2020-01-03 09:03
takashiki 发表于 2016-7-27 11:57
LZSS、LZARI、LZ77、LZW、LZ4等等解压都需要大内存
LZO、QuickLZ解压是不占用内存资源的(QuickLZ可选占 ...

我特意去了解了下QuickLZ,QLZ_STREAMING_BUFFER选0,仅仅是不使用hash缓存,这个当然会占用很大内存

但是它自带压缩和解压2个工作用结构体,我这里只选择解压。QLZ_COMPRESSION_LEVEL选0,解压结构体大小是20K,如果选择2或者3,解压结构体大小是几百K,直接不可行

懊恼的是解压时候,已经解压的内容,在解压之后的内容时是需要回溯的,这样就无法满足我说的任意位置解压,或者说改造起来会相当困难
如果后面的内容不需要回溯,我只要把之前解压内容丢弃不写入,等到到达指定偏移位置才真正的写就可以了,rle算法就是具有这样的特性,即已解压内容对于之后未解压内容是无关的,貌似霍夫曼编码在解码时也具有这个特性,
不知道霍夫曼编码压缩率如何
KongQuan
2楼-- · 2020-01-03 10:29
直接include 带数组的C文件, 然后就可以用sizeof(数据),得到大小,就可以解析数据,然后压缩了。
takashiki
3楼-- · 2020-01-03 13:32
 精彩回答 2  元偷偷看……
myxiaonia
4楼-- · 2020-01-03 15:26
KongQuan 发表于 2016-7-27 16:02
直接include 带数组的C文件, 然后就可以用sizeof(数据),得到大小,就可以解析数据,然后压缩了。 ...

是的  但是mdk可不能直接输出文件吧  现在打算用tcc试试
myxiaonia
5楼-- · 2020-01-03 18:51
takashiki 发表于 2016-7-27 16:25
miniLZO宣传完全不占用RAM,但是好像同样是要回溯的,要在任意位置解压估计还就真的只有RLE合适。
Huffma ...

是啊 huffman编码只对字节作为基本单元 要是能够统计不定长字符串作为基本单元就真的是开挂了
KongQuan
6楼-- · 2020-01-03 20:55
myxiaonia 发表于 2016-7-27 21:42
是的  但是mdk可不能直接输出文件吧  现在打算用tcc试试

用VC做个工程啊,直接输出文件。

一周热门 更多>