2012-02-09 141 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