Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构中浮动上的zlib压缩_C++_Compression_Byte_Zlib - Fatal编程技术网

C++ 结构中浮动上的zlib压缩

C++ 结构中浮动上的zlib压缩,c++,compression,byte,zlib,C++,Compression,Byte,Zlib,我一直在寻找一种压缩方法,使用zlib库和函数compress一个包含浮点变量的结构 我看到的每个示例都展示了如何压缩字符串,特别是无符号字符* 我的结构很简单: struct Particle{ float x; float y; float z; }; 我正在调用压缩函数,如下所示: uLong initSize = sizeof(Particle); uLongf destSize = initSize * 1.1 + 12; Bytef *dataOrigina

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

我看到的每个示例都展示了如何压缩字符串,特别是无符号字符*

我的结构很简单:

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;
}

如果有人找到了这个问题的解决方案,我现在就开始着手解决了…

您需要将解压缩后的数据复制回粒子结构中,就像您最初复制它一样。或者,您可以使用强制转换而不是副本。然后,您将恢复结构中的原始浮动。不管你认为你在用“decomp[i]”做什么都没有任何意义

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

此外,当压缩三个浮点时,将不会得到任何压缩。我猜想这只是压缩大量这样的粒子结构的前奏。那也许你会有收获的

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


顺便说一句,您应该使用compressBound,而不是*1.1+12,它以zlib库为未来版本保证的方式完全满足您的需要。

您需要将解压缩后的数据复制回粒子结构,就像您一开始就将其复制出来一样。或者,您可以使用强制转换而不是副本。然后,您将恢复结构中的原始浮动。不管你认为你在用“decomp[i]”做什么都没有任何意义

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

此外,当压缩三个浮点时,将不会得到任何压缩。我猜想这只是压缩大量这样的粒子结构的前奏。那也许你会有收获的

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


顺便说一句,您应该使用compressBound,而不是*1.1+12,它以zlib库为未来版本提供的方式完全满足您的需要。

erm,initSize*1.1+12应该是什么?1什么问题的任何解决方案2您希望Bytef decomp指针(我们甚至没有定义)通过该强制转换神奇地成为有效的浮点?initSize*1.1+12应该是zlib用于压缩数据的缓冲区大小。我在几个网站上看到,它必须遵循这条规则。调用压缩函数后,zlib用压缩数据的最终大小更新destSize。您是否检查了压缩和解压缩的返回代码?如果不是Z_OK 0,您可能会有一个解释。事实上,我正在搜索一个解决方案,用zlib.erm压缩结构中包含的浮点数据,initSize*1.1+12应该是什么?1什么问题的任何解决方案2您希望Bytef decomp指针(我们甚至没有定义)通过该强制转换神奇地成为有效的浮点?initSize*1.1+12应该是zlib用于压缩数据的缓冲区大小。我看见他进来了
一些网站表示,它必须遵循这一规则。调用压缩函数后,zlib用压缩数据的最终大小更新destSize。您是否检查了压缩和解压缩的返回代码?如果不是Z_OK 0,你可能会有一个解释。事实上,我正在寻找一个解决方案,用zlib压缩结构中包含的浮点数据。比如说,在SPARC和Intel之间传输压缩的整数也不可移植。压缩数据的可移植性和“如何压缩非字符串数据”是分开的。这是若你们按照我说的做:然后用移位操作将这些整数可移植地转换成一系列字节。您选择在添加两分钱之前不完全阅读我的答案。原始海报没有说明他们想要压缩的原因。如果是在同一台机器中使用,那么可移植性就不是什么大问题。如果是为了传输或存储,那么压缩数据的可移植性是如何压缩的问题的一部分。谢谢@MarkAdler,我现在可以解压缩并显示我的数据了。事实上,这个小程序将用于创建格式良好的PRT文件,该文件将在3D软件中读取。因此,是的,将有一个粒子阵列进行压缩。例如,在SPARC和Intel之间传输压缩的整数也是不可移植的。压缩数据的可移植性和“如何压缩非字符串数据”是分开的。这是若你们按照我说的做:然后用移位操作将这些整数可移植地转换成一系列字节。您选择在添加两分钱之前不完全阅读我的答案。原始海报没有说明他们想要压缩的原因。如果是在同一台机器中使用,那么可移植性就不是什么大问题。如果是为了传输或存储,那么压缩数据的可移植性是如何压缩的问题的一部分。谢谢@MarkAdler,我现在可以解压缩并显示我的数据了。事实上,这个小程序将用于创建格式良好的PRT文件,该文件将在3D软件中读取。因此,是的,将有一个粒子阵列进行压缩。