1

今天我正在阅读一个文件,并提取信息。我已经弄清楚了几乎所有事情,但是由于某种原因,我遇到了一个非常非常烦人的问题!我读了整行并使用 .split() 命令将“句子”分解为“单词”,对吗?然后我将“单词”作为别名:

startAddress = line[ 0 ]
length = line[ 2 ].strip( "(" ).strip( ")" )
...
endAddress = startAddress + length

注意:我去掉了长度,因为在数据文件中它被 () 包围,后来,当我将它加载到 .csv 文件时会导致问题,因为 () 被用作底片。

无论如何,如果我将 0x00230008 作为起始地址并且 (4) 作为长度,我的程序将 0x002300084 作为结束地址而不是 0x00230008C,但是如果我使用 hex(length) 或 hex(startAddress) 甚至 hex(str (length) 或 hex(str(startAddress)) 它会抛出一个错误,说无法将十六进制数字转换为十六进制。同样我也无法将它们转换为整数。

真的,我需要做的就是添加起始地址(以十六进制表示,但以字符串形式读入)和长度(以 int 形式读入并以 int 形式读入)。我尝试过将它们转换,但没有不行。我也试过这条线

endAddress = startAddress + length - 1

它告诉我“ -: 'str' 和 'int' 不支持的操作数类型”所以,我已经尽可能多地玩弄它,但我只是没有弄清楚这一点。我正在考虑通过条删除十六进制值前面的 0x,但随后它作为整数读入并且不正确。

我尝试的最后一件事是直接使用 line[0] 和 line[2](带条)来查找 endAddress,但它给出了所有相同的错误。我试图通过声明 startAddress = 0xFFFFFFFF 来强制输入,然后再将其分配为 line[0],但这不起作用。那么,如果它抱怨它不是十六进制的,我该如何将字符串转换为十六进制数字呢?或者也许我添加它们的方法是错误的?我可以使用其他添加方法吗?

对我来说最大的困惑是,如果我尝试将 startAddress 转换为字符串,然后再转换回十六进制数字,它仍然会抱怨。

4

4 回答 4

2

int接受一个可选参数,指定要将其转换为的整数的基数。所以你可以简单地调用类似的东西:

proper_int = int(number, 16)

获得适当的表示。

例如:

int("10", 16) = 16
int("F0", 16) = 240
int("0x10", 16) = 16

如果您想添加零填充,我建议zfill

"10".zfill(4) = "0010"
于 2013-07-29T21:39:49.207 回答
1

int()默认为 base-10,因此在调用intbase-16 字符串时指定基数:

>>> int('0x00230008', 16)
2293768
于 2013-07-29T21:40:53.397 回答
1

您必须将字符串解析为 base-16 int

>>> int("0x00230008", 16)
2293768

添加整数

>>> int("0x00230008", 16) + 4
2293772

并将其转换回十六进制字符串:

>>> hex(int("0x00230008", 16) + 4)
'0x23000c'

如果需要,您必须使用一些字符串格式而不是hex用零填充它:

>>> '0x%08x' % (int("0x00230008", 16) + 4)
'0x0023000c'
于 2013-07-29T21:41:48.983 回答
0

用途inteval功能:

>>> int('0x002300084', 16)
36700292
>>> eval('0x002300084')
36700292
>>> hex(36700292)
'0x2300084'

hex,octbin函数都接受整数并返回字符串
,而int接受字符串(或 unicode)和一个可选的基本参数(默认为 10)并返回和整数

于 2013-07-29T21:43:17.303 回答