2017-05-05 16 views
4

到uint8_t我有一個字符串如何轉換十六進制使用Ruby

6e6de179a94a4b406efab31f29d216c0e2ff0000 

其中有人告訴我定義爲uint8_t和解壓緯度[8],經度[8]和海拔[4]。

我認爲這個十六進制應該解碼爲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

這就是完美的感謝! –