У меня есть набор закодированных строк 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 «кусок». Это самое простое описание, которое я могу дать для вышеупомянутого фрагмента.
Я понял, где я совершил ошибку, gzuncompress прав, однако в этом контексте. gzdecode() - это функция, которая ожидает сжатый файл gzip. Я добавлю свое исправление к исходному вопросу (в основном я предположил, что функция восстановит массив для меня). –
Я нашел некоторую документацию php, и я вижу, что вы правы. Кто-то придумал ужасно вводящие в заблуждение имена функций gzcompress и gzuncompress, а также gzdeflate и gzinflate. Ни один из них не работает в формате .gz! –