В веб-браузере определен неверный ответ zlib gzip (c ++)

Определяет ли объект методы, расширяющие его классы, для реализации? Нет, и поэтому он не должен быть абстрактным.

Концепция абстрактного класса имеет четко определенное значение, которое не относится к объекту.

1
задан RKTUXYN 18 January 2019 в 17:35
поделиться

1 ответ

Вы не пишете нижний колонтитул gzip, содержащий CRC и длину данных:

std::streamoff size = source.tellg();
int totalSize = size;
int tcrc = 0;
...
  n = source.rdbuf()->sgetn( in, CHUNK );
  strm.avail_in = (uInt)n;
  tcrc = crc32( tcrc, (uint8_t*)in, n );
...
(void)deflateEnd( &strm );
dest.write( (char*)&tcrc, sizeof( tcrc ) );
dest.write( (char*)&totalSize, sizeof( totalSize ) );
return write_len;

Ваш метод __write_magic_header также неверен, поскольку он выделяет только 10 байтов, но затем записывает 10 символов с помощью sprintf который фактически напишет 11 байтов, переполняющих ваш буфер.

В окнах вы не можете отправлять двоичные данные через std::cout, у вас та же проблема, что и при открытии файла с ofstream без указания binary. Чтобы исправить эту проблему, перед использованием std::cout:

_setmode( _fileno( stdout ), _O_BINARY );

необходимо указать следующее:

  1. не заключайте в свои включения #ifdef, Макросы, которые вы используете, являются подробностями реализации и не должны давать / незначительной разницы в производительности современного компилятора.
  2. не используйте «__» в начале имен методов или других идентификаторов, эти имена (вместе с «_» и заглавной буквой) зарезервированы для использования компилятором.
0
ответ дан Alan Birtles 18 January 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: