【问题标题】:Strange Hex Number Encoding奇怪的十六进制数字编码
【发布时间】:2013-12-08 01:07:48
【问题描述】:

我正在处理从使用自定义 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

【问题讨论】:

  • 没有什么明显的想法......您是否尝试过询问您的客户?
  • 您还有更多数据吗?比如100001、200001、500001?
  • 客户端有读取解压文件的工具,但不知道编码逻辑。对于我们当前的目的,我们希望直接读取文件,而不是通过工具。我将编辑问题以包含更多数据示例。
  • 这在某些方面似乎与 4 的因数有关。虽然不太明显。有趣。
  • 我编辑了您的问题以添加一些标签,以便人们更有可能找到此问题的答案。

标签: c# xml hex


【解决方案1】:

看起来像一个普通但被截断的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

【讨论】:

  • 好吧,好吧,忽略了这么明显的事情。毕竟,这不是一个大难题。我的朋友,当之无愧的赏金给你(在我被允许授予它的 15 小时内)。如果 OP 再次检查他的问题,他应该将其标记为答案。
  • 太好了,非常感谢!我认为必须有一个简单而标准的答案。
【解决方案2】:

我可以看到模式,从2 开始。以下是从您的自定义格式中获取十进制值的步骤。

  1. 从字符串的开头跳过D4
  2. 如果LEN() < 3 填充0s 以​​获得至少3 个字母的长字符串
  3. 从字符串的开头取 2 个字母并使用 HEX 到 DEC 转换器进行转换
  4. 1 添加到从第 3 点获取的号码。
  5. 获取输入字符串的其余部分,跳过前 2 个字母
  6. 使用 HEX 到 DEC 转换器从第 5 点转换文本
  7. 计算POW(16, LEN(Y)),其中Y 是第5 点的文本。
  8. 计算X / Y,其中X 是第6 点的数字,Y 是第7 点的文本。
  9. 计算最终结果:POW(2, X)*(1 + Y),其中X 来自第 4 点,Y 来自第 9 点。

看起来很复杂,其实很简单。

我已经为您的示例输入创建了包含所有这些步骤的结果的 Excel Web App 电子表格:http://sdrv.ms/1bO0wnz

【讨论】:

  • 感谢您解决了这个难题。从@Caramiriel 的回答中可以清楚地看出,我们似乎忽略了显而易见的事情。不过为您的解决方案 +1。
  • 感谢这个插图,它很有帮助。
猜你喜欢
  • 2018-04-14
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2011-08-13
  • 2022-01-18
  • 2020-08-28
相关资源
最近更新 更多