класс 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_end, (VALUE)&z);
OBJ_INFECT(dst, src);
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)
-
Переопределяет размер окна заголовка распаковки в сжатом потоке. Размер окна должен быть больше или равен размеру окна сжатого потока.
- Больше 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);
OBJ_INFECT(obj, src);
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;
OBJ_INFECT(obj, src);
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);
OBJ_INFECT(dst, obj);
}
}
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_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
См. также ::new
static VALUE
rb_inflate_set_dictionary(VALUE obj, VALUE dic)
{
struct zstream *z = get_zstream(obj);
VALUE src = dic;
int err;
OBJ_INFECT(obj, dic);
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);
OBJ_INFECT(obj, src);
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.