2010-12-12 8 views
1

私はバイナリファイルを持っていますが、その内容の定義は以下の通りです:すべてのデータはリトルエンディアン(つまり最下位バイトが最初に)に格納されます。以下の例の番号は「HEXで」バイナリファイルからデータHEXHEXと小数変換

11 63 39 46    --- Time, UTC in seconds since 1 Jan 1970. 
01 00     --- 0001 = No Fix, 0002 = SPS 
97 85 ff e0 7b db 4c 40 --- Latitude, as double 
a1 d5 ce 56 8d 26 28 40 --- Longitude, as double 
f0 37 e1 42    --- Height in meters, as float 
fe 2b f0 3a    --- Speed in km/h, as float 
00 00 00 00    --- Heading (degrees ?), as float 
01 00     --- RCR, log reason. 0001=Time, 0004=Distance 
59 20 6a f3 4a 26 e3 3f --- Distance in meters, as double, 
2a      --- ? Don't know 
a8      --- Checksum, xor of all bytes above not including 0x2a 

あるあなたが前の命令に基づいて、このデータ行を変換するために私をサポートできる場合、私は感謝として

"F25D39460200269652F5032445401F4228D79BCC54C09A3A2743B4ADE73F2A83" 

を下回っています。

+0

命令のフォーマットが正しくないにもかかわらず、コンテンツはかなり明白です(もちろん、2番目の最後のバイトを除く)。この説明のあなたの具体的な問題は何ですか? – 6502

答えて

1

おそらく間違っているが、ここでのRubyを使用して、それでショットです:

hex = "F25D39460200269652F5032445401F4228D79BCC54C09A3A2743B4ADE73F2A83" 
ints = hex.scan(/../).map{ |s| s.to_i(16) } 
raw = ints.pack('C*') 
fields = raw.unpack('VvEEVVVvE') 

p fields 
#=> [1178164722, 2, 42.2813707974677, -83.1970117467067, 1126644378, 1072147892, nil, 33578, nil] 

p Time.at(fields.first) 
#=> 2007-05-02 21:58:42 -0600 

#pack#unpackに精通誰かが私に最初の3行を達成するためのより良い方法を示したならば、私はそれを感謝します。

+0

他の値についてはわかりませんが、時間が正しいと確信しています。どうしたの? vb.netやC#にコードがありますか?皆さんのご支援に感謝いたします。 –

+0

@waleednosir 1.各16進文字のペアを整数値に変換します。 2.すべての整数から生のバイト配列を作成し、それぞれを符号なしバイトとして扱います。 3.最初の4バイト( 'V')を符号なしリトルエンディアンlongとして抽出する。 4.それらをエポックとして扱う。 – Phrogz

+0

ありがとう、それは動作します。再度、感謝します 。しかし、どのようにして整数値1178164722を時刻と日付に変換したのか分かりません。また、逆に最初のHEX値を読み取ってINTEGERに変換したのはなぜですか?私は1178164722の値が46395DF2の小数値であるのに対して、私のコードの最初の4バイトは逆であることを意味します。すなわちF25D3946です。あなたの結果はOKですが、私はその理由を理解していません。また、この素敵なことを行うVB.netやC#に簡単なコードがありますか? 。あなたは3行のコードだけでそれを解決しました。それは本当に素晴らしいです。 –

0

私のCygnus Hex Editorは、このようなファイルを読み込み、構造テンプレートを使用してデータをそのネイティブ形式で表示することができました。

これ以外にも、各値を処理して各バイトの変換を処理するだけです。

+0

遅れて申し訳ありませんが、私は各質問のパスを受け入れるか拒否していることを再確認しませんでした。それは私のせいです。私はあなたの天才の答えとインスピレーションを受け入れました。 –

関連する問題