Распакуйте строку с Ruby - PullRequest
       4

Распакуйте строку с Ruby

0 голосов
/ 18 декабря 2018

У меня есть сжатые данные gzip (объект-> массив объектов-> json-> gzip), отправленные с python в rabbitMQ.Если я поймаю его с помощью Python - меня легко декодируют.

Кодирующая функция Python:

def gzip_str(string_):
    out = io.BytesIO()

    with gzip.GzipFile(fileobj=out, mode='w') as fo:
        fo.write(string_.encode())

    bytes_obj = out.getvalue()
    return bytes_obj

Декодирующая функция Python:

def gunzip_bytes_obj(bytes_obj):
    in_ = io.BytesIO()
    in_.write(bytes_obj)
    in_.seek(0)
    with gzip.GzipFile(fileobj=in_, mode='rb') as fo:
        gunzipped_bytes_obj = fo.read()

    return gunzipped_bytes_obj.decode()

Дело в том, что янужно расшифровать его в logstash, так что это должно быть сделано с ruby.Пробовал разные подходы, все похожие на это:

#!/usr/bin/env ruby
# encoding: utf-8
require 'bunny'
require 'base64'
require 'zlib'
require 'stringio'


connection = Bunny.new
connection.start

channel = connection.create_channel
queue = channel.queue('kit_logstash', :durable => true)


begin
  queue.subscribe(block: true) do |_delivery_info, _properties, body|
    puts body
    puts body.encoding
    puts Base64.decode64(body)
    puts Base64.decode64(body).encoding

    body_decoded = Base64.decode64(body.to_s)
    sio = StringIO.new(body_decoded)
    gz = Zlib::GzipReader.new(sio)
    result = gz.read.to_s
  end
rescue Interrupt => _
  connection.close

  exit(0)
end

Сообщение на rabbitMQ выглядит следующим образом:

H4sIAAuxGFwC/4uuVkrNTczMUbJSUMpyyNJLzs9V0lFQSs7PK0lMLgGJgrh5ibmpILYXkC4GCRRnZ+bkFAOFopW0DRXMzS0sLS0NDAzMlWKBkqkppUCZaqXS
dLCCgMqSjPw8sEwBRMQ5WCm2tlZHYeDsjgUA6yqlo/gAAAA=

И его также можно легко декодировать с помощью некоторых онлайн-декодеров.

Но ruby ​​не обрабатывает его каким-либо образом. Он видит, что-то вроде этого:

T\x93\x10D\xFA\xCAQ\x03\xC9\xF8\x82\xF2\x82\x06\xE3\xB4\xB0\xFD]Q\x9A

Или как-то так:

��-,--VJ�M��Q�RP�r��K��U�QPJ��+IL.���y��� ��.   gg������

И, конечно, он говорит: Zlib::GzipFile::Error: not in gzip format AmЯ что то не так делаю?Может быть, что-то с кодировками?Или разница между строками и байтами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...