Ruby: разделить двоичные данные - PullRequest
3 голосов
/ 07 октября 2010

Я хочу разделить data на куски, скажем, 8154 байта:

data = Zlib::Deflate.deflate(some_very_long_string)

Каков наилучший способ сделать это?

Я пытался использовать это:

chunks = data.scan /.{1,8154}/

... но данные были потеряны!data имел size 11682, но при циклическом просмотре каждого куска и суммировании size я получал общий размер 11677. 5 байтов было потеряно!Почему?

Ответы [ 2 ]

5 голосов
/ 07 октября 2010

Регулярные выражения не являются хорошим способом для анализа двоичных данных.Используйте bytes и each_slice для работы с байтами.И используйте pack 'C*', чтобы преобразовать их обратно в строки для вывода или отладки:

irb> data = File.open("sample.gif", "rb", &:read)
=> "GIF89a\r\x00\r........."

irb> data.bytes.each_slice(10){ |slice| p slice, slice.pack("C*") }
[71, 73, 70, 56, 57, 97, 13, 0, 13, 0]
"GIF89a\r\x00\r\x00"
[247, 0, 0, 0, 0, 0, 0, 0, 51, 0]
"\xF7\x00\x00\x00\x00\x00\x00\x003\x00"
...........
0 голосов
/ 03 января 2017

Принятый ответ работает, но создает ненужные массивы и очень медленно работает с большими файлами.

Эта альтернатива отлично работает и намного быстрее (500x для файла 1 МБ и кусков 10 КБ!):

def get_binary_chunks(string, size)
  Array.new(((string.length + size - 1) / size)) { |i| string.byteslice(i * size, size) }
end

Для данного примера вы бы использовали его следующим образом:

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