如何使用 ruby 将十六进制转换为 uint8_t
How to convert hex to uint8_t using ruby
我有一个字符串
6e6de179a94a4b406efab31f29d216c0e2ff0000
我被告知定义为 uint8_t 并解包为纬度 [8]、经度 [8] 和高度 [4]。
我认为这个十六进制应该解码为 54.58335
-5.70542
-15
.
如何使用 Ruby 解码这样的字符串?
有趣的问题:)
该字符串的长度为 40 个十六进制字符,因此它代表 20 个字节。
查看您的 link,纬度为 8 个字节,经度为 8 个字节,海拔高度为 4 个字节。老实说,我只是尝试了 pack
和 unpack
的不同参数,直到它看起来像所需的浮点数:
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 精度和通常的高度范围。
我有一个字符串
6e6de179a94a4b406efab31f29d216c0e2ff0000
我被告知定义为 uint8_t 并解包为纬度 [8]、经度 [8] 和高度 [4]。
我认为这个十六进制应该解码为 54.58335
-5.70542
-15
.
如何使用 Ruby 解码这样的字符串?
有趣的问题:)
该字符串的长度为 40 个十六进制字符,因此它代表 20 个字节。
查看您的 link,纬度为 8 个字节,经度为 8 个字节,海拔高度为 4 个字节。老实说,我只是尝试了 pack
和 unpack
的不同参数,直到它看起来像所需的浮点数:
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 精度和通常的高度范围。