求算法:序列化时的压缩办法

czstemp 2011-07-11 02:10:38
我要把为了把一些int型数据序列化成string后储存。

如果用stringStream,或atoi等函数,序列化后的数据大增,比如int 100000000本来只有4字节,
变成字符串后要10字节,太浪费了。

如果直接内存拷贝,又怕int中有连续的八个二进制00000000,等效于字符串终止符。

有没有快速的编码方法把一段内存变成askii字符?
...全文
266 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jackyjkchen 2011-07-11
我没用过,不是我们用过,一字之差,差之千里
  • 打赏
  • 举报
回复
jackyjkchen 2011-07-11
[Quote=引用 6 楼 czstemp 的回复:]

其实是用mongoDB存储,不知jackyjkchen大侠用过没,如果string中有\0
c_str()会不会错?

另外,我对mongoDB的二进制数据存储不太了解,好像是存文件,估计性能不好
[/Quote]
string可以存二进制数据的,c_str只是个内置类型指针,给你个起始地址,你想延长到哪里全看你自己的逻辑,注意别用strcpy、strlen这样专门处理字符串的函数就可以。

一般数据库都支持二进制存取,我们用过mongoDB,你可以试一下,应该可以。

反正还有base64方案备用,这个是专门用来序列化二进制数据的
  • 打赏
  • 举报
回复
ouyh12345 2011-07-11
string里可以有0的
  • 打赏
  • 举报
回复
czstemp 2011-07-11
其实是用mongoDB存储,不知jackyjkchen大侠用过没,如果string中有\0
c_str()会不会错?

另外,我对mongoDB的二进制数据存储不太了解,好像是存文件,估计性能不好
  • 打赏
  • 举报
回复
jackyjkchen 2011-07-11
你的存储是说“写文件”?

那就更简单了,连内存拷贝都不用的
直接去写int的地址就行了,别忘了用二进制方式或者windows api
  • 打赏
  • 举报
回复
???
用二进制打开文件,写入不就行了。
读取时你也用二进制来读。
  • 打赏
  • 举报
回复
jackyjkchen 2011-07-11
阶段==截断
  • 打赏
  • 举报
回复
jackyjkchen 2011-07-11
而且,直接内存拷贝有什么不可以?

如果只是网络传输的话,socket是不会阶段的,你直接用unsigned char*存储就是了。

即便用string,也没问题,别用+=,用append,强制指定长度
  • 打赏
  • 举报
回复
jackyjkchen 2011-07-11
base64编码,长度*4/3,增加不多,电子邮件就这样做的
  • 打赏
  • 举报
回复
发帖
其它技术问题

3859

社区成员

C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
帖子事件
创建了帖子
2011-07-11 02:10
社区公告
暂无公告