Несжатие PHP (ZLIB) сжатого массива C (ZLIB) возвращает бессмысленность - PullRequest
0 голосов
/ 09 февраля 2012

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

Блок программы на 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šiSE@IEfŽ

Может ли кто-нибудь дать мне совет / подсказку о том, что я мог быбыть пропущенным?

------ Добавленная информация -----

Я чувствую, что проблема заключается в том, что в настоящее время 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 будет количеством 'строк' во входном файле.


РЕДАКТИРОВАТЬ (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 Ответ

1 голос
/ 11 февраля 2012

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

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

...