Упаковка и распаковка данных в Ruby
Одна из самых крутых особенностей, реализованных в Ruby очень продуманно - это упаковка и распаковка данных. Я не встречал такого простого программного интерфейса для работы с бинарными данными даже в таких компилируемых языках, как Golang, Rust и C++. Например, если вам нужно из двух байтов сделать 16-битное число, это будет выглядеть так: ``` [32, 255].pack(‘C*’).unpack(‘S>’) => [8447] ```
Чтобы стало понятнее, что происходит, просто прибавим 1 байт к результату и переведем его обратно в массив байтов: ``` [8447 + 256].pack(‘S>’).unpack(‘C*’) => [33, 255] ```
Также можно легко и просто перевести байты в шестнадцатеричную или двоичную строку: ``` [32, 255].pack(‘C*’).unpack(‘H*’).first.chars.each_slice(2).map(&:join) => [“20”, “ff”] [33, 255].pack(‘C*’).unpack(‘B*’).first.chars.each_slice(8).map(&:join) => [“00100001”, “11111111”] ```
И это только малая часть всех возможных вариантов использования.
Приходилось ли вам пользоваться методами `Array#pack`, `String#unpack` в своих проектах?