我有一组存储在数据库中的ZLIB压缩/ base64编码字符串(在C程序中完成)。我写了一个小的PHP页面,应该检索这些值并绘制它们(字符串最初是浮动列表)。原始输入格式的C(ZLIB)压缩数组的解压缩返回乱码
error=compress2(comp_buffer, &comp_length,(const Bytef*)data.mz ,(uLongf)length,Z_DEFAULT_COMPRESSION); /* compression */
if (error != Z_OK) {fprintf(stderr,"zlib error..exiting"); exit(EXIT_FAILURE);}
mz_binary=g_base64_encode (comp_buffer,comp_length); /* encoding */
(实施例)::C程序的
存储块,它压缩/编码
292.1149 8379.5928
366.1519 101313.3906
367.3778 20361.8105
369.1290 17033.3223
375.4355 1159.1841
467.3191 8445.3926
每一列被压缩/编码为单个串。为了重建原始数据我用下面的代码:
//$row[4] is retrieved from the DB and contains the compressed/encoded string
$mz = base64_decode($row[4]);
$unc_mz = gzuncompress($mz);
echo $unc_mz;
然而,这给了我下面的输出:
f6jEÍ„]Eš[email protected]Ž
任何人都可以给我什么我可能会丢失小费/提示吗?
------添加的信息-----
我觉得这个问题来自于目前PHP的观点$ unc_mz一个字符串,而在现实中,我将有一个事实,重新构造一个包含X行的数组(这个输出来自一个9行文件),但是......不知道该如何分配。
是这样做的C程序就大致是这样的:
uncompress(pUncompr , &uncomprLen , (const Bytef*)pDecoded , decodedSize);
pToBeCorrected = (char *)pUncompr;
for (n = 0; n < (2 * peaksCount); n++) {
pPeaks[n] = (RAMPREAL) ((float *) pToBeCorrected)[n];
}
其中peaksCount将是在输入文件“行”的量。
EDIT(15-2-2012):我的代码的问题是,我并没有重建阵列,固定代码如下(如果有人需要一个类似的片段可能是方便的):
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
$m< = base64_decode($row[4]);
$mz_int = gzuncompress($int);
$max = strlen($unc_mz);
$counter = 0;
for ($i = 0; $i < $max; $i = $i + 4) {
$temp= substr($unc_mz,$i,4);
$temp = unpack("f",$temp);
$mz_array[$counter] = $temp[1];
$counter++;
}
未压缩的串必须被切成对应于浮子的长度块,解压缩(),然后从格兰二进制“块”重构浮点数据。这是我可以为上面的代码片段提供的最简单的描述。
我想出了我犯了什么错误,但在这种情况下,gzuncompress是正确的。 gzdecode()是需要gzip压缩文件的函数。我将追加我的'修复'到原来的问题(基本上我认为该功能会为我重建阵列)。 – 2012-02-15 12:45:58
我找到了一些php文档,我发现你是正确的。有人提出了gzcompress和gzuncompress函数的可怕误导性名称,以及gzdeflate和gzinflate。它们都不是以.gz格式操作的! – 2012-02-16 04:44:15