用于复制文件块的工具
cpchunk的Python项目详细描述
它是什么
cpchunk(“copy chunk”)从一个文件复制二进制数据并将其插入(或替换)另一个文件。具体来说,它将len字节从文件A中的offset1复制到文件B中的offset2中。它还可以附加到文件B或替换文件B。因此,cpchunk可以被看作是部分文件而不是整个文件的复制工具。
警告:cpchunk通常假设您知道自己在做什么。覆盖超出预期的数据或截断要更新的文件可能非常容易。无论程序是否正常工作,我们都不能为使用程序时发生的任何事情承担任何责任。与任何工具一样,如果不想丢失数据,请备份数据!
有什么好处
cpchunk是作为rom黑客工具编写的,但它没有处理rom的特定行为。当你想把一个文件的一部分复制到另一个文件的一部分时,cpchunk就是你的工具。
这是一个真实的例子。街机游戏“金刚驴”将其主程序代码从0x0000存储到0x3fff的内存空间。但是,此代码必须分成四个不同的rom文件:
- 0x0000-0fff存储在c_5et_g.bin中
- 0x1000-1FF存储在C CT G.bin中
- 0x2000-2FF存储在C bt_g.bin中
- 0x3000-3FFF存储在C_5at_g.bin中
由于这些块是连续的,为这个硬件制作rom的程序员可能更愿意创建一个16kb的rom,比如dkong.bin,然后将rom分成四个。要执行此拆分,程序员将运行以下命令:
cpchunk -s 0x0000 -l 0x1000 dkong.bin c_5et_g.bin cpchunk -s 0x1000 -l 0x1000 dkong.bin c_5ct_g.bin cpchunk -s 0x2000 -l 0x1000 dkong.bin c_5bt_g.bin cpchunk -s 0x3000 -l 0x1000 dkong.bin c_5at_g.bin
-s选项定义要从中复制的源偏移量,-l选项定义要复制的块的长度。因此,这些行可以读取为“从dkong.bin中提取0x1000字节,从0x0000开始,并将它们放入c_5et_g.bin”,以此类推。
假设程序员正在为金刚初级硬件制作rom。这个硬件的rom映射相当陌生:
- DJR1-C_5b_f-2.5b包含0x0000-0fff,然后是0x3000-3fff
- DJR1-C U 5C U F-2.5C包含0x2000-27FF、0x4800-0x4FFF、0x1000-0x17FF、0x5800-0x5FFF
- DJR1-C_5e_f-2.5e包含0x4000-47FF、0x2800-0x2FF、0x5000-0x57FF、0x1800-0x1FF
很奇怪,不是吗?但对cpchunk来说没问题。下面是命令:
cpchunk -s 0x0000 -l 0x1000 dkongjr.bin djr1-c_5b_f-2.5b cpchunk -s 0x3000 -l 0x1000 dkongjr.bin -a djr1-c_5b_f-2.5b cpchunk -s 0x2000 -l 0x800 dkongjr.bin djr1-c_5c_f-2.5c cpchunk -s 0x4800 -l 0x800 dkongjr.bin -a djr1-c_5c_f-2.5c cpchunk -s 0x1000 -l 0x800 dkongjr.bin -a djr1-c_5c_f-2.5c cpchunk -s 0x5800 -l 0x800 dkongjr.bin -a djr1-c_5c_f-2.5c cpchunk -s 0x4000 -l 0x800 dkongjr.bin djr1-c_5e_f-2.5e cpchunk -s 0x2800 -l 0x800 dkongjr.bin -a djr1-c_5e_f-2.5e cpchunk -s 0x5000 -l 0x800 dkongjr.bin -a djr1-c_5e_f-2.5e cpchunk -s 0x1800 -l 0x800 dkongjr.bin -a djr1-c_5e_f-2.5e
这里,-a选项用于附加到目标文件。注意,-a选项不必放在目标文件名之前,但是它的角色在那里看起来最清晰。
如何安装
如果您有python 3.4或更高版本,首选的方法是在命令行中键入pip install cpchunk。
如何使用
键入cpchunk -h应该足以掌握参数。这里有一些例子。
从0x1000到0x1fff(包括0x1000和0x1fff)复制文件:
cpchunk -s 0x1000 -l 0x1000 src.bin ripped.bin
在这种情况下,由于未指定目标偏移量,cpchunk将替换而不是修改ripted.bin。
将文件从0x1000剥离到0x1FF(包括0x1000)并在0x800将其插入另一个文件:
cpchunk -s 0x1000 -l 0x1000 src.bin -d 0x800 dest.bin在本例中,如果不存在预编译,则程序将引发错误。touch如果您真的想插入一个空文件,可以使用其他方法创建该文件。
从0x1000到0x1fff(包括0x1000)复制一个文件并将其附加到另一个文件的末尾:
cpchunk -s 0x1000 -l 0x1000 src.bin -a dest.bin