首页 文章

C zlib压缩在struct中的float上

提问于
浏览
2

我一直在寻找一种压缩的方法,使用zlib库(和函数compress)包含float vars的结构 . 我看到的每个例子都展示了如何压缩字符串,特别是unsigned char * .

我的结构很简单:

struct Particle {float x;漂浮y;漂浮z; };

我正在调用压缩函数如下:

uLong initSize = sizeof(Particle); uLongf destSize = initSize * 1.1 12; Bytef dataOriginal =(Bytef)malloc(initSize); Bytef dataCompressed =(Bytef)malloc(destSize);粒子p; memset(&p,0,sizeof(Particle)); p.x = 10.24; p.y = 23.5; p.z = 7.4; memcpy(dataOriginal,&p,sizeof(p)); compress(dataCompressed,&destSize,dataOriginal,initSize);

但是当我尝试解压缩我的数据以查看其中的内容时,我无法恢复到我的初始浮点值:

Bytef decomp =(Bytef)malloc(initSize); uncompress(decomp,&initSize,dataCompressed,destSize); for(int i = 0; i <initSize; i){std :: cout <<(float)decomp [i] << std :: endl; }

如果有人有这个问题的解决方案,我现在2天就开始了......很多人!

1 回答

  • 3

    您需要将解压缩的数据复制回Particle结构中,就像您首先将其复制出来一样 . (或者你可以使用强制转换而不是副本) . 然后,您将恢复结构中的原始浮动 . 不管是什么,你认为你正在做'decomp [i]`没有任何意义 .

    但是这有几个问题 . 首先,这只能确保使用相同的编译器在同一台机器上工作,甚至只能在同一版本的编译器中工作 . 如果不同的编译器或不同版本选择以不同方式对齐结构,则压缩数据将无法在两者之间进行传输 . 如果不同机器之间存在不同的浮动表示,则压缩数据将不可转移 .

    此外,压缩三个浮子时不会受到任何压缩 . 我认为这只是压缩大量此类粒子结构的前奏 . 那么也许你会得到这个 .

    更好的方法是首先将浮点数转换为整数所需的精度 . 您应该知道应用程序的范围和有用的位数 . 这将在使用 compress() 之前压缩,仅使用所需的位数而不是每个浮点数32 . 然后使用移位操作将这些整数可移植地转换为一系列字节 . 然后,您还可以将差分应用于连续粒子(例如x1-x2,y1-y2,z1-z2),如果连续粒子之间存在相关性,则可能会改善压缩 .

    顺便说一句,你应该使用 compressBound() 而不是 * 1.1 + 12 ,它以zlib库为未来版本保证的方式完全按照你想要的方式运行 .

相关问题