首页 > 解决方案 > 从十六进制字符串中获取十进制值

问题描述

我在将十六进制值转换为十进制时遇到了一些麻烦。理论上很容易Python

value = '000100000001f8c65400fefe3195000001230000000000000000000000000000000000000000642b00090700000000001e'
print(int(value,16))

这是结果:

153914086775326342143664486282692693880080977757509806775956245674142536051238079779640236240803190331364310253598

因为这里一切都好。

这个字符串代表不同字节的有效负载,我知道两件事:

当我想使用一些具体的字节时问题就来了,因为理论上我知道在字节 18、19、20 和 21 中我有一些以 39 开头的十进制数(我不知道后面的其他数字)。但是当我想解码它时,我找不到它。

# First try
a = value[36:43] # 18*2 to 21*2
print(a)
print(int(a,16))

# Second try
a = value[18:22] # 18 to 21
print(a)
print(int(a,16))

用肉眼,我可以看到第一个结果中的第三个和第四个值是 this 39

153914086775326342143664486282692693880080977757509806775956245674142536051238079779640236240803190331364310253598

但另一次,如果我这样做

# third try
a = value[2:4]
print(a)
print(int(a,16))

我找不到这个 39,并且值与第一个结果不同。

我该怎么做?我确定这很容易,但我不知道该怎么做。我想学习访问不同的字节,但我不明白其中的逻辑。

编辑试图更好地解释它

我有这个十六进制有效载荷:

153914086775326342143664486282692693880080977757509806775956245674142536051238079779640236240803190331364310253598

这表示以字节为单位收集的不同值的集合。

因此,我尝试的是能够访问一个字节(或一组)以了解其十进制值。例如,我知道字节 18 到 21 是纬度,字节 39 是电池。我怎样才能解码它python

(在我的城市,纬度总是从 39 开始,这就是我之前所说的)

非常感谢

标签: python

解决方案


您似乎对数字基础感到非常困惑。也请查找适当的术语。例如:

十六进制值通常用两个十六进制值表示,如 FF 2E 32 等

我不确定你想在这里说什么。您似乎已经注意到十六进制值通常被分成字节(每个十六进制数字是 4 位),但是您表达它的方式让我想知道您的意思。字节级分离不是“表示”;相反,它是一种阅读便利。

您的中心问题似乎是如何找到仅编码为十六进制版本的子序列的特定十进制子序列。您是否将字符编码(例如 ASCII、UniCode 或 EBCDIC)与简单的基本表示混淆了?字符编码允许您进行这种子字符串转换;更改数字基数根本不是相同的操作。例如:

base 16  base 10
    1        1
   21       33 = 2 * 16 + 1
  B21     2849 = 11 * 16*16 + 2 * 16 + 1
  B2       178 = 11 * 16 + 2
  B         11

一个碱基中没有用另一个碱基中的子序列编码的子序列。例如,以 10 为底的“84”是整个十六进制数的符号特征,而不是任何子序列。


推荐阅读