В настоящее время я пытаюсь с целью изучения базового использования zlib создать небольшую утилиту для сжатия и распаковки файлов на С++. Я использую функции compress2 и uncompress, предоставляемые zlib, чтобы облегчить это. Однако обе эти функции принимают различные типы, кажущиеся специфичными для zlib (Bytef, uLongf и т. д.), без каких-либо автоматических преобразований между ними и типами C++ (точнее, указатели на каждый из этих типов). Это делает простой код для взаимодействия с zlib более сложным, если только я не напишу все свое приложение, основанное на типах zlib.
Мой вопрос состоит из 3 частей:
- Какова цель этих типов в отличие от встроенных типов, таких как
unsigned long, которые я использую в своем собственном коде ввода-вывода файлов для представления длины файлов? - Как правильно использовать эти типы? Могу ли я переинтерпретировать приведение моих указателей
charк данным для (де) сжатия до указателейBytefбез изменения длины данных из длины моего массива символов? Посколькуchar— это один байт, а имяBytefпредполагает, что оно имеет одинаковую длину, я думаю, что могу, но хочу убедиться. Могу ли я просто назначитьunsigned long(или другой интегральный тип, отличный от zlib) дляuLongfи других, казалось бы, интегральных типов zlib? - Где официальная документация zlib по этим типам?
Я просмотрел руководство по zlib и полностью прочитал разделы, которые могут показаться важными, вместе с клавишей Ctrl +f вспомогательный поиск, безрезультатно. Мой поисковик тоже не знает ответа.
Bytef— это псевдоним типа дляunsigned char. Уверены ли вы? - person Lightness Races in Orbit   schedule 14.07.2018unsigned long- это 32 или 64 бита в зависимости от того, какой компилятор вы используете. - person Sid S   schedule 14.07.2018off_t, но даже в этом случае вам все равно придется использовать#define _FILE_OFFSET_BITS 64на 32-разрядных платформах. - person o11c   schedule 14.07.2018char*, а неunsigned char*), что делает указатели, используемые функциями zlib, несовместимыми с моими собственными. Заголовок zconf.h говорит мне, для чего они определены, но typedef предполагает, что я должен использовать их как-то иначе, чем встроенные типы (иначе, зачем делать их похожими на отдельные типы?). Однако комментарии здесь, похоже, говорят об обратном. Есть ли официальные документы, подтверждающие это? - person john01dav   schedule 14.07.2018fобозначает дальний указатель из 16-битной сегментированной эпохи, которая имела разный синтаксис в разных компиляторах, поэтому абстракция. В настоящее время он определяется как обычный указатель. - person o11c   schedule 14.07.2018