#ruby #string #modbus
Вопрос:
Как оператор, я хочу записать product_name
строку в 8 регистров 16-битных беззнаковых целых чисел Modbus по адресам 0..7;
Зная, что в этой реализации каждый 16-битный регистр содержит два кода ASCII и, следовательно, может представлять два строковых символа, я напишу:
Строка ввода | Коды ASCII распаковать(‘C*’) | Регистры Modbus |
---|---|---|
АИНЗ | [65, 73, 78, 90] | [6573, 7890] |
Я хотел бы , чтобы мы могли просто использовать .unpack('S*')/pack('S*')
и хранить две 16-битные записи [18753, 23118]
, но нам нужно сохранить объединение двух символов ASCII.
Существует ли более простая и элегантная реализация, чем эта:
# "AINZ" -gt; [6573, 7890] def str_to_registers(str) str.unpack('C*').join.scan(/d{4}/).map(amp;:to_i) end # [6573, 7890] -gt; "AINZ" def registers_to_str(arr) arr.flat_map { |reg| reg.to_s.scan(/d{2}/) }.map(amp;:to_i).pack('C*') end
Комментарии:
1. Ваш вопрос начинается как история пользователя 🙂