класс Zlib::Inflate
Zlib:Inflate — это класс для распаковки сжатых данных. В отличие от Zlib::Deflate, экземпляр этого класса не может быть продублирован (клонирован, дублирован).
Публичные методы класса
static VALUE
rb_inflate_s_inflate(VALUE obj, VALUE src)
{
struct zstream z;
VALUE dst, args[2];
int err;
StringValue(src);
zstream_init_inflate(&z);
err = inflateInit(&z.stream);
if (err != Z_OK) {
raise_zlib_error(err, z.stream.msg);
}
ZSTREAM_READY(&z);
args[0] = (VALUE)&z;
args[1] = src;
dst = rb_ensure(inflate_run, (VALUE)args, zstream_ensure_end, (VALUE)&z);
return dst;
} Распаковывает string. Выбрасывает исключение Zlib::NeedDict, если для распаковки требуется предопределённый словарь.
Этот метод почти эквивалентен следующему коду:
def inflate(string) zstream = Zlib::Inflate.new buf = zstream.inflate(string) zstream.finish zstream.close buf end
См. также Zlib.deflate
static VALUE
rb_inflate_initialize(int argc, VALUE *argv, VALUE obj)
{
struct zstream *z;
VALUE wbits;
int err;
rb_scan_args(argc, argv, "01", &wbits);
TypedData_Get_Struct(obj, struct zstream, &zstream_data_type, z);
err = inflateInit2(&z->stream, ARG_WBITS(wbits));
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
ZSTREAM_READY(z);
return obj;
} Создаёт новый поток распаковки для распаковки. window_bits задаёт размер буфера истории и может принимать следующие значения:
- 0
-
Использует размер окна из заголовка zlib сжатого потока.
- (8..15)
-
Переопределяет размер окна заголовка inflate в сжатом потоке. Размер окна должен быть больше или равен размеру окна сжатого потока.
- Больше 15
-
Добавляет 32 к window_bits для включения декодирования zlib и gzip с автоматическим определением заголовка или добавляет 16 для декодирования только формата gzip (для потока, не являющегося gzip, будет выброшено исключение
Zlib::DataError). - (-8..-15)
-
Включает режим raw deflate, который не будет генерировать значение проверки и не будет искать никаких значений проверки для сравнения в конце потока.
Это используется с другими форматами, которые используют формат сжатия deflate, например, zip, который предоставляет свои собственные значения проверки.
Пример
open "compressed.file" do |compressed_io|
zi = Zlib::Inflate.new(Zlib::MAX_WBITS + 32)
begin
open "uncompressed.file", "w+" do |uncompressed_io|
uncompressed_io << zi.inflate(compressed_io.read)
end
ensure
zi.close
end
end
Публичные методы экземпляра
static VALUE
rb_inflate_addstr(VALUE obj, VALUE src)
{
struct zstream *z = get_zstream(obj);
if (ZSTREAM_IS_FINISHED(z)) {
if (!NIL_P(src)) {
StringValue(src);
zstream_append_buffer2(z, src);
}
}
else {
do_inflate(z, src);
if (ZSTREAM_IS_FINISHED(z)) {
zstream_passthrough_input(z);
}
}
return obj;
} То же, что и IO.
static VALUE
rb_inflate_add_dictionary(VALUE obj, VALUE dictionary)
{
VALUE dictionaries = rb_ivar_get(obj, id_dictionaries);
VALUE checksum = do_checksum(1, &dictionary, adler32);
rb_hash_aset(dictionaries, checksum, dictionary);
return obj;
} Предоставляет потоку распаковки словарь, который может потребоваться в будущем. Можно предоставить несколько словарей. Поток распаковки автоматически выберет нужный пользовательский словарь, исходя из того, какой словарь требуется потоку.
static VALUE
rb_inflate_inflate(VALUE obj, VALUE src)
{
struct zstream *z = get_zstream(obj);
VALUE dst;
if (ZSTREAM_IS_FINISHED(z)) {
if (NIL_P(src)) {
dst = zstream_detach_buffer(z);
}
else {
StringValue(src);
zstream_append_buffer2(z, src);
dst = rb_str_new(0, 0);
}
}
else {
do_inflate(z, src);
dst = zstream_detach_buffer(z);
if (ZSTREAM_IS_FINISHED(z)) {
zstream_passthrough_input(z);
}
}
return dst;
} Ввод deflate_string в поток распаковки и возвращает вывод из потока. Вызов этого метода приводит к очистке буфера ввода и буфера вывода потока. Если строка nil, этот метод завершает поток, как и Zlib::ZStream#finish.
Если предоставлен блок, последовательные распакованные фрагменты из deflate_string передаются в блок, и возвращается nil.
Выбрасывает исключение Zlib::NeedDict, если для распаковки требуется предопределённый словарь. Set словарь с помощью Zlib::Inflate#set_dictionary, а затем вызывайте этот метод снова со пустой строкой, чтобы очистить поток:
inflater = Zlib::Inflate.new begin out = inflater.inflate compressed rescue Zlib::NeedDict # ensure the dictionary matches the stream's required dictionary raise unless inflater.adler == Zlib.adler32(dictionary) inflater.set_dictionary dictionary inflater.inflate '' end # ... inflater.close
См. также Zlib::Inflate.new
static VALUE
rb_inflate_set_dictionary(VALUE obj, VALUE dic)
{
struct zstream *z = get_zstream(obj);
VALUE src = dic;
int err;
StringValue(src);
err = inflateSetDictionary(&z->stream,
(Bytef*)RSTRING_PTR(src), RSTRING_LENINT(src));
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
return dic;
} Устанавливает предопределённый словарь и возвращает string. Этот метод доступен только после того, как было выброшено исключение Zlib::NeedDict. Подробности см. в zlib.h.
static VALUE
rb_inflate_sync(VALUE obj, VALUE src)
{
struct zstream *z = get_zstream(obj);
StringValue(src);
return zstream_sync(z, (Bytef*)RSTRING_PTR(src), RSTRING_LEN(src));
} Ввод string в конец буфера ввода и пропускает данные до тех пор, пока не будет найден полный момент сброса. Если момент найден в буфере, этот метод очищает буфер и возвращает false. В противном случае он возвращает true, и последующие данные полного момента сброса сохраняются в буфере.
static VALUE
rb_inflate_sync_point_p(VALUE obj)
{
struct zstream *z = get_zstream(obj);
int err;
err = inflateSyncPoint(&z->stream);
if (err == 1) {
return Qtrue;
}
if (err != Z_OK) {
raise_zlib_error(err, z->stream.msg);
}
return Qfalse;
} Дословный перевод из исходной документации:
What is this?
:)
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.