2011-01-23 148 views
2

我收到了表示一组32位浮点数的二进制字符串。从一系列16位MODBUS寄存器中报告,第一个寄存器代表较低位,第二个寄存器代表较高位。我能够以可怕的丑陋方式重新排列寄存器,然后解码为浮点数。我希望这样会更有吸引力,但是我没有完成任务。本质上,我将字符串解压缩为一个十六进制字符串数组,将其转换为字符串,将高位切片并将它们放在低位之前,然后将其转换为整数基数16,将其打包为32位整数,然后解包一个浮点数,然后选择数组中的第一个值。如果你原谅我,最后一句话让我需要哭泣。别无他法:我如何将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 

回答

2

这是行得通的吗?

t = <binary-string-returned-here> 
result = (t[2..3] + t[0..1]).unpack('F')[0] 
+0

它没有。返回的二进制字符串是我调试显示为[4f] [76] [43] [c0]的部分。忽略前导和尾随部分。 Rx(9字节):[02] [04] [4f] [76] [43] [c0] [0f] [5d] => 1.05342283266357e + 33 – markf 2011-01-23 17:27:33

相关问题