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库为将来版本保证的方式正确执行您想要的操作。