奇怪的十六进制数编码

时间:2013-11-23 00:29:57

标签: c# xml hex

我正在使用文本可读文件,这些文件是从使用类似自定义XML结构的客户端系统导出的。我需要能够从大量这些文件中解析和提取数据,而无需记录它们的结构。

我主要解决了文件结构问题,但是我对如何编码值感到困惑。我可以在系统中手动查找正确的值作为比较。一些例子:

Export Data = System Value

D411E848 = 500000

D40F86A = 100000

D41086A = 200000

我很确定领先的“D”是一个标记,表示该字段是十进制或双精度值。原因是所有数字字段以“D”开头,所有文本字段以“S”开头。以下“4”也可能是字段数据类型的一部分,因为所有数字字段似乎都以“D4”开头。

但是,在导出数据值的任何组合上从十六进制转换为十进制都不会产生正确的结果。

如何进行转换?

额外的数据映射:

Value   Export File
1   D3FF
2   D4
3   D4008
4   D401
5   D4014
6   D4018
7   D401C
8   D402
9   D4022
10  D4024
100 D4059
1000    D408F4
100000  D40F86A
500000  D411E848
500001  D411E8484
500002  D411E8488
500003  D411E848C
500004  D411E849
500005  D411E8494
500006  D411E8498
500007  D411E849C
500008  D411E84A
500009  D411E84A4
500010  D411E84A8

2 个答案:

答案 0 :(得分:6)

看起来像正常但被截断的IEEE 754 64-bit (double precision) number

0x408F400000000000 = 1000
408F4 (truncated)
D408F4 (prefixed with D)


0x411E848000000000 = 500000
411E848 (truncated)
D411E848 (prefixed with D)

尝试使用以下网站将其转换为参考:http://www.binaryconvert.com/result_double.html?decimal=053048048048048048

答案 1 :(得分:1)

我可以从2开始看到模式。以下是从自定义格式中获取小数值的步骤。

  1. 从字符串的开头略过D4
  2. 如果LEN() < 3填充0 s以获得至少3个字母长字符串
  3. 从字符串的开头取2个字母,然后使用HEX转换为DEC转换器
  4. 1添加到第3点的数字。
  5. 获取输入字符串的其余部分,跳过前2个字母
  6. 使用HEX转换为DEC转换器
  7. 从第5点转换文本
  8. 计算POW(16, LEN(Y)),其中Y是第5点的文字。
  9. 计算X / Y,其中X是第6点的数字,Y是第7点的文字。
  10. 计算最终结果:POW(2, X)*(1 + Y)X来自第4点,Y来自第9点。
  11. 它可能看起来很复杂,但实际上非常简单。

    我已经为您的示例输入创建了Excel Web App spreadsheat以及所有这些步骤的结果:http://sdrv.ms/1bO0wnz