Как Ruby обрабатывает байты/двоичные файлы?

Я пытаюсь отправить серию бинарных байтов через сокет, чтобы соответствовать определенному стандарту, который использует моя компания. Никто в моей компании не использовал Ruby для этого раньше, но на других языках они отправляют данные по одному байту за раз (обычно с каким-то методом "пакет" ).

Я все равно не могу создать двоичный файл на лету или вообще создать байты (ближайший я могу найти его, как вы можете превратить строку в байты, представляющие ее символы).

Я знаю, вы можете сказать что-то вроде:

@var = 0b101010101

Но как бы преобразовать строку в форму "101010101" или результирующее целое, созданное, когда я вставляю string.to_i (2) в фактический двоичный файл. Если я просто отправлю строку через сокет, не будет ли это просто отправлять ASCII для "0" и "1" вместо буквенных символов?

Конечно, есть какой-то способ сделать это изначально в Ruby?

Ответ 1

Чтобы создать строку с произвольной последовательностью байтов, сделайте следующее:

binary_string = "\xE5\xA5\xBD"

"\ x" - это специальный escape-код для кодирования произвольного байта из шестнадцатеричного, поэтому "\ xE5" означает байт 0xE5.

Затем попробуйте отправить эту строку в сокете.

Ответ 2

Не знаю, достаточно ли этого, но вы можете индексировать биты в целое число в ruby.

n = 0b010101

n # => 21

n = 21

n[0]  # => 1
n[1]  # => 0
n[2]  # => 1
n[3]  # => 0
n[4]  # => 1
n[5]  # => 0

Ответ 3

Посмотрите на метод String.unpack. Это пример:

str = "1010"
str.unpack("cccc")
=> [49, 48, 49, 48]

Это даст вам целочисленные значения. Существует больше способов сделать преобразование.