У меня есть набор сжатых / 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++;
}
Несжатая строка должна быть разрезана на куски, соответствующиепо длине поплавка распакуйте (), затем восстановитеданные с плавающей запятой из двоичного «чанка».Это самое простое описание, которое я могу дать для приведенного выше фрагмента.