Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert hex to uint8_t using ruby

I have a string

6e6de179a94a4b406efab31f29d216c0e2ff0000

which I am told is defined as uint8_t and unpacks as latitude [8], longitude [8] and altitude [4].

I think this hex should decode to 54.58335 -5.70542 -15.

How could I decode such a string using Ruby?

like image 428
Ruby Dev Avatar asked Oct 18 '22 13:10

Ruby Dev


1 Answers

Fun question :)

The string is 40 hex chars long, so it represents 20 bytes.

Looking at your link, that would be 8 bytes for latitude, 8 bytes for longitude, and 4 bytes for the altitude. To be honest, I just tried the different parameters for pack and unpack until it looked like the desired floats:

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

Here's a shorter way:

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

I'm not sure about the altitude. Since it's stored as an integer, it's probably modified later with some linear function to fit the GPS precision and the usual altitude range.

like image 182
Eric Duminil Avatar answered Oct 21 '22 07:10

Eric Duminil