2012-02-09 8 views
0

У меня есть набор закодированных строк ZLIB с сжатой/base64 (выполненных в программе C), которые хранятся в базе данных. Я написал небольшую страницу PHP, которая должна извлекать эти значения и строить их (строка первоначально была списком поплавков).Ускоренное сжатие сжатого массива C (ZLIB) в PHP (ZLIB)

Кусок программы C, которая сжимает/кодирует:

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 

Каждый столбец прессовали/закодирована в виде одной строки. Для того, чтобы восстановить исходные данные, я использую следующий код:

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

распакованного строка должна быть нарезанной на куски, соответствующие длине поплавка, распаковать(), а затем реконструирует данные с плавающей точкой из двоичного Teh «кусок». Это самое простое описание, которое я могу дать для вышеупомянутого фрагмента.

ответ

1

compress2() создает формат zlib (RFC 1950). Я должен был предположить, что что-то, называемое gzuncompress(), ожидает формат gzip (RFC 1952). Таким образом, gzuncompress() сразу же не сможет найти заголовок gzip.

Вам нужно будет использовать deflateInit2() в zlib, чтобы запросить, чтобы deflate() создавал вывод в формате gzip или находил или предоставлял другую функцию в PHP, которая ожидает формат zlib.

+0

Я понял, где я совершил ошибку, gzuncompress прав, однако в этом контексте. gzdecode() - это функция, которая ожидает сжатый файл gzip. Я добавлю свое исправление к исходному вопросу (в основном я предположил, что функция восстановит массив для меня). –

+0

Я нашел некоторую документацию php, и я вижу, что вы правы. Кто-то придумал ужасно вводящие в заблуждение имена функций gzcompress и gzuncompress, а также gzdeflate и gzinflate. Ни один из них не работает в формате .gz! –