Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中读取特定地址处的十六进制值?_Python_Hex - Fatal编程技术网

如何在Python中读取特定地址处的十六进制值?

如何在Python中读取特定地址处的十六进制值?,python,hex,Python,Hex,假设我有一个文件,我对读取和存储特定地址的十六进制值感兴趣,如下面的代码片段: 22660 00 50 50 04 00 56 0F 50 25 98 8A 19 54 EF 76 00 22670 75 38 D8 B9 90 34 17 75 93 19 93 19 49 71 EF 81 我想读取0x2266D处的值,并能够用另一个十六进制值替换它,但我不知道如何执行。我曾尝试使用open('filename','rb'),但这将其理解为值的ASCII表示形式,我不知道如何在需要更改地址

假设我有一个文件,我对读取和存储特定地址的十六进制值感兴趣,如下面的代码片段:

22660 00 50 50 04 00 56 0F 50 25 98 8A 19 54 EF 76 00
22670 75 38 D8 B9 90 34 17 75 93 19 93 19 49 71 EF 81
我想读取0x2266D处的值,并能够用另一个十六进制值替换它,但我不知道如何执行。我曾尝试使用
open('filename','rb')
,但这将其理解为值的ASCII表示形式,我不知道如何在需要更改地址时进行选择

谢谢


编辑:举个例子,我有

rom = open("filename", 'rb')
for i in range(5):
     test = rom.next().split()
     print test
rom.close()
这一产出的这一产出是:<代码>[“NES\x1a”和“B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f(\x0f(\x0f\x0f(\x0f论坛论坛论坛论坛论坛论坛论坛论坛论坛论坛论坛论坛论坛论坛论坛组织组织,,,,,,“,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,“;”、“!\x0f\x0f1”、“!”、“$\x14\x14\x14\x13\x13\x03\x04\x0f\x0f\x03\x13”!!\x00\x00\x00\x00!!”、“(”、“\x0f”\“x0f”、“\x14\x11\x12\x0f\x0f\x0f”、“\x10”、“5'4\x0270&\x02\x02\x02\x02\x02\x02\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0226&\x13\x0f\x0f\x0f\x0f\x02\x02\x02\x02\x


远远超过5个字节,虽然其中一些是十六进制的,但有些已经被ASCII所取代。

考虑到这不是一个很大的文件(ROM应该适合今天的计算机内存),只需执行
data=open('filename','rb')。read()
。现在您可以对数据执行任何操作(如果您打印它,它将显示ascii,但这只是数据!)。不幸的是,字符串对象不支持项分配,有关详细信息,请参阅此答案:

就你而言:


data=data[0:0x2266C]+str(0xFF)+data[0x2266D:

考虑到这不是一个很大的文件(ROM应该适合今天的计算机内存),只需执行
data=open('filename','rb')。read()
。现在您可以对数据执行任何操作(如果您打印它,它将显示ascii,但这只是数据!)。很遗憾,字符串对象不支持项分配,有关详细信息,请参阅此答案:

就你而言:


data=data[0:0x2266C]+str(0xFF)+data[0x2266D://code>

没有迹象表明某些字节已被其ASCII表示形式替换。某些字节恰好可打印

对于二进制文件,您可以简单地
查找
位置偏移量并写入字节。对于二进制文件,使用行迭代器是有问题的,因为二进制blob中没有有意义的“行”

您可以执行如下就地编辑(在伪Python中):


但是,当然,您可能希望在一个副本上进行编辑,或者在内存中(稍后提交,如@JosepValls的回答中所述),或者在一个文件副本上进行编辑。当然,在内存中占用整个文件的问题是,有时系统可能会阻塞;)为此,您可能希望将其作为文件的一部分。

没有迹象表明某些字节已被其ASCII表示形式替换。有些字节恰好是可打印的

对于二进制文件,您可以简单地
查找
位置偏移量并写入字节。对于二进制文件,使用行迭代器是有问题的,因为二进制blob中没有有意义的“行”

您可以执行如下就地编辑(在伪Python中):


但是,当然,您可能希望在一个副本上进行编辑,或者在内存中(稍后提交,如@JosepValls的回答中所述),或者在一个文件副本上进行编辑。当然,在内存中占用整个文件的问题是,有时系统可能会阻塞;)为此,您可能希望成为文件的一部分。

您问题中的代码块可能是文件的文本,还是(二进制)文件的hexdump?@CongMa这是二进制文件的hexdump。具体来说,我正在查看NES rom文件的段。在这种情况下,您的意思是什么“这将其读取为值的ASCII表示形式”?能否显示一个示例代码段和输出?您还需要以读写方式打开该文件。问题中的代码块可能是文件文本的副本,还是(二进制)的十六进制转储文件?@CongMa这是一个二进制文件的hextump。具体来说,我正在查看一个NES rom文件的段。在这种情况下,“这读取它作为值的ASCII表示形式”是什么意思?能否显示一个示例代码段和输出?还需要以读写方式打开文件。
with open("filename", "rb+") as f:
    f.seek(0x2266D)
    the_byte = f.read(1)
    if len(the_byte) != 1:
        # something's wrong; bolt out ...
    else
        transformed_byte = your_function(the_byte)
        f.seek(-1, 1)  # back one byte relative to the current position
        f.write(transformed_byte)