gpt4 book ai didi

c++ - 对结构中的 float 进行 zlib 压缩

转载 作者:搜寻专家 更新时间:2023-10-31 01:51:45 25 4
gpt4 key购买 nike

我一直在寻找一种压缩方法,使用 zlib 库(和函数 compress)包含浮点变量的结构。

我看到的每个例子都在展示如何压缩一个字符串,特别是一个unsigned char*

我的结构很简单:

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

我调用压缩函数如下:

uLong initSize = sizeof(Particle);
uLongf destSize = initSize * 1.1 + 12;
Bytef *dataOriginal = (Bytef*)malloc( initSize );
Bytef *dataCompressed = (Bytef*)malloc( destSize );

Particle 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 天了...

最佳答案

您需要将解压缩的数据复制回 Particle 结构,就像您首先将其复制出来一样。 (或者您可以只使用强制转换而不是拷贝)。然后你将恢复结构中的原始 float 。无论您认为使用“decomp[i]”做什么都没有任何意义。

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

此外,压缩三个 float 时不会得到任何压缩。我认为这只是压缩大量此类 Particle 结构的前奏。那么也许你会有所收获。

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

顺便说一句,您应该使用 compressBound(),而不是 * 1.1 + 12,它以 zlib 保证的方式完全按照您的要求执行 future 版本的库。

关于c++ - 对结构中的 float 进行 zlib 压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13550466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com