今天我正在读取一个文件,并提取信息。我几乎什么都想明白了,但由于某种原因,我遇到了一个非常非常烦人的问题!我读了整行,并使用.split()命令将"句子"分解为"单词",对吗?然后我将"单词"别名为:
startAddress = line[ 0 ]
length = line[ 2 ].strip( "(" ).strip( ")" )
...
endAddress = startAddress + length
注意:我去掉了长度,因为在数据文件中,它被()封装,稍后,当我将其加载到.csv文件中时,会出现问题,因为()被用作负数。
无论如何,如果我将0x00230008作为起始地址,(4)作为长度,我的程序将0x002300084作为结束地址,而不是0x00230008C,但如果我使用十六进制(长度)或十六进制(startAddress),甚至十六进制(str(长度)和十六进制(str(startAddress)),它会抛出一个错误,说十六进制数无法转换为十六进制。同样,我也不能把它们转换成整数。
实际上,我所需要做的就是添加起始地址(以十六进制表示,但以字符串形式读取)和长度(以int表示,以int形式读取)。我曾尝试过转换它们,但没有成功。我也试过
endAddress = startAddress + length - 1
它告诉我"-:'str'和'int'的操作数类型不受支持",所以,我已经尽可能地使用了它,但我只是没有弄清楚。我想通过strip删除十六进制值前面的0x,但后来它读起来是一个整数,这是不正确的。
我尝试的最后一件事是直接使用第[0]行和第[2]行(带条)来查找endAddress,但它给出了相同的错误。我试图通过声明startAddress=0xFFFFFFFF来强制类型,然后将其赋值为行[0],但这并没有起作用。那么,如果一个字符串抱怨它是十六进制的,而不是十六进制,我该怎么把它转换成十六进制呢?或者也许我添加它们的方法是错误的?我可以使用其他添加方法吗?
对我来说,最大的困惑是,如果我试图将startAddress转换为字符串,然后再转换回十六进制数字,它仍然会抱怨。
int
采用一个可选参数,指定要将其转换为的整数的基数。所以你可以简单地称之为:
proper_int = int(number, 16)
为了得到一个恰当的表达。
例如:
int("10", 16) = 16
int("F0", 16) = 240
int("0x10", 16) = 16
如果你想添加零填充,我推荐zfill
:
"10".zfill(4) = "0010"
您必须将字符串解析为base-16 int
>>> int("0x00230008", 16)
2293768
添加int
>>> int("0x00230008", 16) + 4
2293772
并将其转换回十六进制字符串:
>>> hex(int("0x00230008", 16) + 4)
'0x23000c'
如果需要的话,你必须使用一些字符串格式而不是hex
来填充零:
>>> '0x%08x' % (int("0x00230008", 16) + 4)
'0x0023000c'
int()
默认为基数-10,因此在对基数-16字符串调用int
时指定基数:
>>> int('0x00230008', 16)
2293768
使用int
或eval
函数:
>>> int('0x002300084', 16)
36700292
>>> eval('0x002300084')
36700292
>>> hex(36700292)
'0x2300084'
hex
、oct
和bin
函数都取整数并返回字符串
而int
采用字符串(或unicode)和可选的基参数(默认为10),并返回整数