C ++ zlib压缩浮点结构

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

我的结构很简单:

结构体粒子{

float x;
浮动y;
float 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));

px = 10.24;
py = 23.5;
pz = 7.4;

memcpy(dataOriginal,&p,sizeof(p));
压缩(dataCompressed,&destSize,dataOriginal,initSize);

但是当我试图解压缩数据以查看内部内容时,我无法回到我的初始浮点值:

Bytef decomp =(Bytef)malloc(initSize);
解压(分解,&initSize,datacompressed,destSize);

for(int i = 0; i <initSize; i ++){

std :: cout <<(float)decomp [i] << std :: endl;
}

如果任何人有解决这个问题的方法,我已经从2天开始了......非常感谢!


您需要将解压缩的数据复制回Particle结构中,就像您先复制它一样。 (或者你可以只使用强制转换而不是复制)。 然后你会恢复结构中的原始浮点数。 无论你认为自己在用'decomp [i]'做什么都没有任何意义。

但是这有几个问题。 首先,这只能保证在同一台机器上工作,使用相同的编译器,甚至只能在相同版本的编译器内工作。 如果不同的编译器或不同的版本选择以不同的方式对齐结构,那么压缩的数据将不能在两者之间传输。 如果不同机器之间有不同的浮动表示,压缩数据将不可传输。

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

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

顺便说一下,您应该使用compressBound()而不是* 1.1 + 12 ,它可以按照zlib库为将来版本保证的方式正确执行您想要的操作。

链接地址: http://www.djcxy.com/p/86961.html

上一篇: C++ zlib compression on float in a struct

下一篇: unsigned char limited to 127 on osx lion?