Как 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]
Это даст вам целочисленные значения. Существует больше способов сделать преобразование.