【问题标题】:Reverse Engineering Fixed Point Numbers逆向工程定点数
【发布时间】:2019-08-16 09:09:26
【问题描述】:

我目前正在将发动机安装到另一辆车中,并且我想保持车载计算机内部的燃油经济性计算正常工作。我设法成功地重新编码了这部分,但我一直试图找出他们使用的(简单?)两字节数据格式,但没有成功。我假设它是定点符号,但无论我如何移动它,它都不会对齐。这两个字节如何代表正确的数字?

Some examples:

Bytes (Dec) --> Result
174,10 -> 2,67 
92,11  -> 2,84
128,22 -> 3,75
25,29  -> 4,85
225,23 -> 3,98 
00,40  -> 5,00 
128,34 -> 5,75

【问题讨论】:

  • 左边应该是两个独立的整数,右边是浮点数吗?
  • 是的,我编辑了我的帖子以使其更清晰。

标签: embedded fixed point notation


【解决方案1】:

这里是部分解决方案:

首先,交换字节。然后加入他们:

结果(十六进制)是:

0AAE
0B5C
1680
1D19
17E1
2800
2280

然后将其拆分为第一位(4位),其余三位(12位)并保留整个数字(16位)。结果(十进制)是:

0  2734   2734
0  2908   2908
1  1664   5760
1  3353   7449
1  2017   6113
2  2048  10240
2   640   8832

第一个数字似乎是一个乘法因子。 0代表1024,1代表1536,2代表2048。公式可能是f = (1024 + n * 512)

现在将整数除以乘数。结果四舍五入到小数点后两位:

 2734 / 1024 =  2.67
 2908 / 1024 =  2.84
 5760 / 1536 =  3.75
 7449 / 1536 =  4.85
 6113 / 1536 =  3.98
10240 / 2048 =  5.00
 8832 / 2048 =  4.31

它适用于除最后一个数字之外的所有数字,可能包含错误。

所以它似乎是某种浮点数,但我不认识具体的格式。可能有一个更简单的公式来解释这个数字。

【讨论】:

  • 非常感谢,这让我走上了正轨!它实际上要容易得多:对于每 5000 步,除数增加 512,那么最后一个值也是正确的。所以公式是这样的:(float)combinedNumber/(1024 + 512 * ((uint)combinedNumber/5000))
猜你喜欢
  • 2011-08-11
  • 2012-08-26
  • 2021-01-08
  • 2020-07-29
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
相关资源
最近更新 更多