2012-02-09 239 views
0

我有一组存储在数据库中的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++; 
    } 

未压缩的串必须被切成对应于浮子的长度块,解压缩(),然后从格兰二进制“块”重构浮点数据。这是我可以为上面的代码片段提供的最简单的描述。

回答

1

compress2()产生zlib格式(RFC 1950)。我不得不猜测,所谓的gzuncompress()期待gzip格式(RFC 1952)。所以gzuncompress()会在找不到gzip头部时立即失败。

您需要在zlib中使用deflateInit2()来请求deflate()生成gzip格式的输出,或者在PHP中查找或提供需要zlib格式的其他函数。

+0

我想出了我犯了什么错误,但在这种情况下,gzuncompress是正确的。 gzdecode()是需要gzip压缩文件的函数。我将追加我的'修复'到原来的问题(基本上我认为该功能会为我重建阵列)。 – 2012-02-15 12:45:58

+0

我找到了一些php文档,我发现你是正确的。有人提出了gzcompress和gzuncompress函数的可怕误导性名称,以及gzdeflate和gzinflate。它们都不是以.gz格式操作的! – 2012-02-16 04:44:15