2011-01-23 9 views
2

32ビット浮動小数点数のグループを表すバイナリ文字列を受け取ります。これは、第1のレジスタが下位ビットを表し、第2のレジスタが上位ビットを表す、16ビットのMODBUSレジスタの対から報告される。私は恐ろしく醜いやり方で、レジスタを並べ替えてからフロートにデコードすることができます。私はこれがかなり魅力的であることを望みますが、私はその仕事に失敗しています。基本的には、文字列を16進数の配列にアンパックして文字列に変換し、上位ビットをスライスして低ビットの前に置いて、それを整数16に変換し、32ビット整数にパックし、浮動小数点数を計算し、次に配列の最初の値を選択します。もしあなたが私を許したら、その最後の文は私に泣く必要があります。さらに邪魔することなく:32ビットバイナリ文字列をルビのfloatに変換するには

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] [03] [4f] [76] [43] [c0] [0f] [5d] => 1.05342283266357e + 33 – markf

+0

上記に対する正しい応答は、 "[43c04f76] .to_i(16)]。pack( 'L')。アンパック( 'F')[0] => 384.620788574219 – markf

+0

エンディアン。あなたは本質的に正しい:(結果[2..3] +結果[0..1])。アンパック( 'g')の作業。百万のおかげで – markf

関連する問題