У меня есть сжатые данные 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Я что то не так делаю?Может быть, что-то с кодировками?Или разница между строками и байтами?