我有一組存儲在數據庫中的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