2017-05-05 15 views
4

を用いuint8_tするヘクスを変換するために、私は、文字列Iを聞いていどのルビ

6e6de179a94a4b406efab31f29d216c0e2ff0000 

を有するuint8_tとして定義され、緯度として解凍される[8]、経度[8]と高度[4]。

この16進数は54.58335-5.70542-15にデコードする必要があります。

Rubyを使用してこのような文字列をデコードするにはどうすればよいですか?

+0

https://gist.github.com/comms365/20d0ccff6c2827d09f6bb90f2da162f8 –

+1

リンク先のページ「[mcve]」と「[研究の量スタックオーバーフローユーザーの努力が期待されていますか?](http://meta.stackoverflow.com/questions/261592) "あなたの努力の証拠を見たいと思います。何を試しましたか?検索して何も見つけられませんでしたか?あなたはものを見つけましたが、それは助けになりませんでしたか?コードを書こうとしましたか?そうでない場合、なぜですか?もしそうなら、試したことを示す最小のコード例とは何ですか?それがなければ、あなたが試してみたことがないように見えます。 –

答えて

3

楽しい質問:)

文字列の長さは40桁で、20バイトを表します。

リンクを見ると、緯度は8バイト、経度は8バイト、高度は4バイトになります。正直に言うと、それは必要な山車のように見えたまで、私はちょうどpackunpackのための異なるパラメータを試してみました:

hex = "6e6de179a94a4b406efab31f29d216c0e2ff0000" 

lat_hex, lon_hex, alt_hex = hex[0,16], hex[16, 16], hex[32, 8] 
lat_int, lon_int, alt_int = lat_hex.to_i(16), lon_hex.to_i(16), alt_hex.to_i(16) 
p [lat_int].pack('q>').unpack('D').first 
# 54.583297 
p [lon_int].pack('q>').unpack('D').first 
# -5.705235 

ここで短い方法です:

hex.scan(/../).map{ |x| x.hex }.pack('C*').unpack('DDL') 
# => [54.583297, -5.705235, 65506] 

は、私は標高についてはよく分かりません。それは整数として格納されているため、後でGPS精度と通常の高度範囲に合わせるための線形関数で後で修正されている可能性があります。

+0

thats完璧な感謝! –

関連する問題