Ruby (Dart): представление строки в виде пар кодов ASCII в 16-битных регистрах modbus

#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. Ваш вопрос начинается как история пользователя 🙂