如何使用ruby将十六进制转换为uint8_t

Lei*_*mes 5 ruby hex decode decimal data-conversion

我有一串

6e6de179a94a4b406efab31f29d216c0e2ff0000
Run Code Online (Sandbox Code Playgroud)

有人告诉我将其定义为uint8_t,并将其解压缩为纬度[8],经度[8]和高度[4]。

我认为此十六进制应解码为54.58335 -5.70542 -15

如何使用Ruby解码这样的字符串?

Eri*_*nil 3

有趣的问题:)

该字符串的长度为 40 个十六进制字符,因此表示 20 个字节。

查看您的链接,纬度为 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
Run Code Online (Sandbox Code Playgroud)

这是一个更短的方法:

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

我不确定海拔高度。由于它存储为整数,因此稍后可能会使用一些线性函数对其进行修改,以适应 GPS 精度和通常的海拔范围。