【问题标题】:Convert HEX 32 bit from GPS plot on Ruby从 Ruby 上的 GPS 图转换 HEX 32 位
【发布时间】:2014-02-03 19:36:03
【问题描述】:

我正在使用以下十六进制值表示 GPS/GPRS 图中的不同值。全部以 32 位整数形式给出。

例如:

296767 是为十六进制数报告的十进制值(无符号):3F870400

另一个:

34.96987500 是在弧度分辨率 10^(-8) 上给出的十进制浮点值(有符号),报告为 DA4DA303。

在 Ruby 上将十六进制数字转换为相应值的过程是什么?

我已经尝试使用以下指令解包/打包:LHh。还尝试添加二进制补码并将它们转换为二进制然后十进制,但没有成功。

【问题讨论】:

  • 您能提供更多参考资料吗? 296767 是 '0x0004873F'.to_i(16) 。 . .该数字是首先提供的 32 位 int 最低有效字节。我不确定浮点数是如何编码的。
  • @NeilSlater 关于浮点数,是一个 32 位有符号整数,必须乘以 10^(-8) 才能获得弧度分辨率的预期值( 34.96987500 )。
  • 如果你把34.96987500 * 10^8转换成十六进制,你会得到D06FCB6C
  • 知道了:34.96987500 是度数 - 你应该这么说!得到它的转换是'03A34DDA'.to_i(16) * 180 / (Math::PI * 10 ** 8)
  • 实际上是字节(8 位,2 个十六进制数字),而不是半字节(4 位,1 个十六进制数字)。

标签: ruby gps hex byte bits


【解决方案1】:

如果您期望一个整数值:

input = '3F870400'
output = input.scan(/../).reverse.join.to_i( 16 ) 
# 296767

如果您希望获得学位:

input = 'DA4DA303'
temp = input.scan(/../).reverse.join.to_i( 16 )
temp = ( temp & 0x80000000 > 1 ? temp - 0x100000000 : temp ) # Handles negatives
output = temp * 180 / (Math::PI * 10 ** 8)
# 34.9698751282937

解释:

十六进制字符串表示 Integer 的字节,首先存储最低有效字节(或 little-endian)。要将其存储为原始字节,您可以使用[296767].pack('V') - 如果您首先拥有原始字节,您只需反转binary_string.unpack('V')。但是,您有一个十六进制表示。您可能会采取几种不同的方法(包括将十六进制放回字节并将其解包),但在上面我选择将十六进制字符串操作为最高有效字节的第一个形式并使用 Ruby 的 String#to_i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多