2011-01-23 16 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

相關問題