Я получаю двоичную строку, которая представляет группу 32-разрядных чисел с плавающей запятой. Он сообщается из серии пар 16-битных регистров MODBUS, в которой первый регистр представляет младшие биты, а второй регистр представляет старшие биты. Я могу ужасно уродливо переставить регистры, а затем расшифровать их до плавающего числа. Я бы хотел, чтобы это было немного более привлекательно, но я не справляюсь с этой задачей. По сути, я распаковываю строку в массив шестнадцатеричных строк, преобразую в строку, разрезаю старшие биты и помещаю их перед младшими битами, затем преобразую в целое число 16, упаковываю в 32-битное целое, распаковываю с плавающей точкой, затем выбирая первое значение в массиве. Извините, последнее предложение заставляет меня плакать. Без лишних слов:
def read_dual_input_registers(addr, npairs)
@values = Array.new
result = <binary-string-returned-here>.unpack('H*').to_s
npairs.to_i.times do
register = result.slice!(4..7) + result.slice!(0..3)
@values.push([register.to_i(16)].pack('L').unpack('F')[0])
end
@values
end