2012-02-09 15 views
0

データベースに格納されているZLIB圧縮/ base64エンコード文字列(Cプログラムで実行される)があります。これらの値を取得してプロットする小さなPHPページを作成しました(文字列はもともと浮動小数点のリストでした)。元の入力形式のC(ZLIB)圧縮配列のPHP(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 */ 

(実施例):

292.1149 8379.5928 
366.1519 101313.3906 
367.3778 20361.8105 
369.1290 17033.3223 
375.4355 1159.1841 
467.3191 8445.3926 

を各列は単一の文字列として符号化/圧縮された圧縮/符号化するCプログラムの

チャンク。

f6jEÍ„]Eš[email protected]Ž 

は誰もが私に私が行方不明かもしれないものについてのヒント/ヒントを与えることができる:これは私に次のような出力を提供しますけれども

//$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; 

:私は次のコードを使用しています、元のデータを復元するには?

------情報を追加しました-----

私は問題は現在、PHPビュー$ unc_mzを単一の文字列として私がしなければならない現実にしながら、事実から来ていると感じ

再構築物X行(この出力は9行のファイルからのものです)を含む配列ですが、割り当ての仕方はわかりません。 peaksCountは、入力ファイルの「行」の量になります

uncompress(pUncompr , &uncomprLen , (const Bytef*)pDecoded , decodedSize); 
pToBeCorrected = (char *)pUncompr; 
for (n = 0; n < (2 * peaksCount); n++) { 
    pPeaks[n] = (RAMPREAL) ((float *) pToBeCorrected)[n]; 
} 

それをしたCプログラムでは、おおよそ次のように行ってきました。


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

圧縮されていない文字列が()をTEHバイナリ「チャンク」から浮動小数点データを再構成、解凍フロートの長さに対応するチャンクに切断されなければなりません。それは私が上記のスニペットのために与えることができる最も簡単な記述です。

答えて

1

compress2()はzlib形式(RFC 1950)を生成します。私は、gzuncompress()と呼ばれるものがgzipフォーマット(RFC 1952)を期待していると推測する必要があります。したがって、gzuncompress()はgzipヘッダーが見つからないとすぐに失敗します。

deflate()がgzip形式の出力を生成するようにzlibでdeflateInit2()を使用するか、zlib形式を必要とするPHPで別の関数を見つけたり提供したりする必要があります。

+0

私は間違いをどこで犯したのか分かりましたが、gzuncompressはこの文脈で正しいです。 gzdecode()は、gzip圧縮ファイルが必要な関数です。私はオリジナルの質問に私の「修正」を追加します(基本的には、私のために配列を再構成すると仮定しました)。 –

+0

私はいくつかのPHPドキュメントを見つけました。あなたが正しいとわかります。誰かが、gzcompressとgzuncompress関数、gzdeflateとgzinflateのためにひどく誤解を招く名前を思いついた。いずれも.gz形式では動作しません! –

関連する問題