2016-04-26 2 views
0
before = new unsigned char[mSizeNeeded*4]; 

uLong value = compressBound(mSizeNeeded*4); 
after = new unsigned char[value]; 

compress(after, &value, before, mSizeNeeded*4); 

fwrite(&after, 1, value, file); 

'before' содержит кучу аудиоданных, хранящихся в нем, и я пытаюсь сжать его и сохранить его в 'after'. Затем я записываю его в файл. Файл имеет тот же размер, что и исходный файл, он также содержит те же данные, что и раньше (насколько я могу судить).Функция сжатия zlib не делает ничего. Зачем?

Сжатие также возвращает OK, поэтому я знаю, что сжатие не прерывается.


Хорошо, так что моя проблема только в сжатии (я думаю). Я могу запустить сжимать, а затем я могу распаковать и получить правильные данные. Кроме того, он записывает в файл, а fwrite возвращает 561152, но счет (значение) - 684964. Таким образом, похоже, что что-то не так с fwrite. Я посмотрел более внимательно, и после данных, отличных от данных перед.

561152 такой же размер, как и исходные аудиоданные в WAV-файле, который у меня (лишенный заголовков .wav, конечно).


ответ

0

Основываясь на вашем оригинальный текст:

fwrite (&before, ... 

Я пытаюсь сжать его и хранить его в 'после'. Я тогда записываю его в файл.

думаю нет. Вы пишете оригинальные данные к файлу, скорее всего, вы должны написать after.


Другое, что вы должны делать, это проверить возвращаемые значения из функций, которые вас волнуют. Другими словами, compress() расскажет вам, возникает ли проблема, но вы, похоже, полностью игнорируете эту возможность.

Аналогичным образом fwrite() также использует свое возвращаемое значение, чтобы указать, было ли оно успешным или нет. Поскольку вы не включили код, показывающий, как это настроено, это также отличная возможность. В частности, fwrite находится под no обязательство написать весь блок в файл за один удар (устройство может быть заполнено и т. Д.), Поэтому у есть значение, поэтому вы можете обнаружить и настроить для этой ситуации. Часто, это лучший вариант, чем:

fwrite (&after, 1, value, file); 

является:

fwrite (&after, value, 1, file); 

, поскольку последний всегда будет давать вам один для полностью успешной записи, что-то еще для отказа какого-либо описания.

Это был бы мой первый шаг в установлении, где проблема.

Кроме того, существует множество других (как правило, применимые) методы, которые вы можете использовать, чтобы выследить проблемы, такие как:

  • выводя все переменные после того, как они изменяются или устанавливаются (например, возвращение значения функций, after, before, value и т. д.).
  • удалите выходной файл перед запуском вашей программы, чтобы убедиться, что он создан заново.
  • введите код через отладчик, чтобы вы могли посмотреть что происходит под обложками.
  • очистка after от всех нулевых байтов (или известного шаблона), чтобы гарантировать, что вы не получите устаревшие данные.

И, в качестве последнего подхода (при условии, что источник Zlib код находится в свободном доступе), вы также можете изменить (или отладки в) это так, что вы можете ясно видеть, что происходит под крышки.

+0

Извините, что я понял, что это те же данные. Я просто забыл изменить его. Файл должен по-прежнему быть меньше, так как значение будет иметь значение «после» после сжатия – Ben

+0

Да, оно вернуло значение успеха – Ben

+0

. Первая форма 'fwrite()' предпочтительнее, потому что она сообщает вам, сколько байтов было написано. Вторая форма не может рассказать вам о частичной записи. – EJP

Смежные вопросы