【问题标题】:Finding the correct formula for encoded hex value in decimal找到十进制编码十六进制值的正确公式
【发布时间】:2011-03-04 12:34:32
【问题描述】:

这里有一个案例,我想弄清楚如何将十六进制数转换为十进制数。

我之前有过类似的情况,但发现如果我反转十六进制字符串,并交换每个第二个值(小端序),然后将其转换回十进制值,我得到了我想要的,但这个是不同的。

这是我们收到的值

价值编号。 1 是 12月:1348916578 十六进制:0a66ab46

我现在只有一个十进制/十六进制,但我正在尝试获取更多值来比较结果。

我希望任何数学天才都能够看到这里可能使用的公式:)

谢谢

【问题讨论】:

  • 对不起,但我认为这两个值根本不相等。以这种格式写入十六进制数字只有一种方法,Windows 计算器会给你它。你确定这不是 base 64 还是什么? (编辑也不是这样)。
  • 你为什么不告诉我们你从哪里得到这些值?
  • 不仅您从哪里获得这些值,为什么您认为它们是平等的?您确定数字中没有复制粘贴错误吗?
  • 我认为它们可能以某种方式相等,因为当我用二进制表示每个时,我观察到它们每个都有 14 个 1。
  • 我从客户发给我的一张卡片上得到了数字,十进制数字印在卡片上,读取卡片的软件(这是一张 EM RFID 卡)输出十六进制值。我刚拿到一张卡,我会尝试再获得一张卡

标签: delphi math hex


【解决方案1】:
1348916578
= 5    0    6    6     D    5    6    2 hex
= 0101 0000 0110 0110  1101 0101 0110 0010

0a66ab46
= 0    A    6    6     A    B    4    6 hex
= 0000 1010 0110 0110  1010 1011 0100 0110

所以,如果一个数字是这样的,用十六进制数字表示:

AB CD EF GH

那么可能的转换是:

rev(B) rev(A) rev(D) rev(C) rev(F) rev(E) rev(H) rev(G)

其中rev 反转半字节中的位顺序;虽然我可以看到反转也可以按字节完成。

【讨论】:

  • 这对你有用吗?你是如何在delphi中以代码方式实现它的。可以在 php 中做到这一点吗?
【解决方案2】:

有趣....我将十进制和十六进制扩展为二进制,这分别是你得到的:

1010000011001101101010101100010
1010011001101010101101000110

通过填充一些 0 将底部的一个滑过,然后分成 8 字节的块。

10100000 1100110 11010101 01100010
10100    1100110 10101011 01000110

好像开始排队了。让我们让底部看起来像顶部。

用 0 填充第一个块,它是相等的。 第二块没问题。 将第 3 块左右切换(反转),10101011 变为 11010101。

10100000 1100110 11010101 01000110

第四个也是如此。
10100000 1100110 11010101 01100010

现在它们是一样的。

10100000 1100110 11010101 01100010
10100000 1100110 11010101 01100010

这适用于所有情况吗?不可能知道。

【讨论】:

  • 哇,奇怪,也许这就是问题,但是我需要额外的十进制/十六进制来检查这个
  • 有趣的是,第一个 10100 可能是 000101000,因为二进制文件不会真正显示以 0 开头的值
  • 我赞成 Barry 的回答,因为它很好地体现了我的观察结果。
  • 我创建了一个 delphi 实现,如果有人感兴趣,我可以提供 ot
  • 我对delphi实现感兴趣!
【解决方案3】:

x0a66ab46 的十进制值为 174500678 或 1185637898(取决于您使用的字节序,任何 8、16 或 32 位访问)。这些价值观之间似乎没有直接联系。也许你只是把这对弄错了?如果您发布一些有关如何生成这些值对的代码会有所帮助。

顺便说一句,Delphi 有一个很好的小方法:SysUtils.IntToHex

【讨论】:

  • 我知道 delphi 的 inttohex :) 在之前的项目中使用过它
【解决方案4】:

我们发现,提供 10 位十进制格式的最小 USB 阅读器实际上并未显示完整的二进制代码。十六进制阅读器找到完整的二进制代码。所以基本上可以通过在二进制转换后去掉 9 个字符来将十六进制值转换为 10 位十进制。

但这反过来不起作用(除非我们从十六进制值中去掉 2 个字符,否则 10 位十进制代码将仅显示完整二进制代码的一部分)。

所以案件结案。

【讨论】:

  • 这个问题已解决 :)))) 但我可能会在其他代码上遇到其他情况,谢谢 :-)
  • rev 函数是将数字映射到它们的二进制反转;所以 rev(1) = rev(0001b) => 1000b = 8, rev(2) = rev(0010b) = 0100b = 4, rev(5) = rev(0101b) => 1010b = 10,等等。你可以使所有情况的查找表甚至是 switch 语句。组合和分离位,您可以进行移位和屏蔽。
猜你喜欢
  • 2018-07-26
  • 1970-01-01
  • 2011-12-09
  • 2016-04-17
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2014-11-03
  • 2014-11-30
相关资源
最近更新 更多