Linux 22.04 LTS 上的 xxd - 我是否可以将一个小文件按照给定的偏移量写入一个较大的文件中,而无需复制和粘贴小文件的内容?

Linux 22.04 LTS 上的 xxd - 我是否可以将一个小文件按照给定的偏移量写入一个较大的文件中,而无需复制和粘贴小文件的内容?

我正在尝试设置旧 GameBoy Pokemon 游戏的修补副本。我可以通过 Windows 上的其他应用程序手动完成所有操作,也许可以尝试使用 Windows 命令行程序来加快此过程,但由于 Ubuntu 已经有 xxd,我想我会尝试一下。

我的最终目标是最终拥有一个 bash 脚本,它将读取几个源文件来修补基础文件的副本。

但在学习 xxd 时,我很难找到这是否可行。我可以为其提供 $ echo "[offset]: [手动复制粘贴或十六进制输入]" | xxd -r -c 256 "Source File.gb" 但我不确定是否可以用“补丁”文件的名称替换手动复制粘贴的内容。不要与使用 patch 命令混淆,我在之前的研究中读到,该命令不适用于二进制(十六进制)文件,但更适用于带行文件。

我可能只需要更多地了解终端如何与标准输出或缓冲区一起工作。如果有人知道这在 xxd 中是否可行,或者可以向我指出一个十六进制编辑器(仅限 linux/ubuntu 或多平台),该编辑器具有可以执行我设想的命令行命令,那就太好了。

我还希望能够让它一次修补超过 256 个字节。参考文件可以实现这一点,但手动完成时,必须使用 -c N,其中 N 是要写入的字节数。但 -c 限制为 256。我曾希望 -l 而不是 -c 可以让我写入更多,但它不起作用,如此处的屏幕截图所示。预期的写入内容在第 30 个字节处停止,文件的其余部分保持不变。当然,解决方法是将步骤分成 256 字节的块,然后将每个应用的损坏块的偏移量向上移动 0x100。命令行和 4 条命令的输出图片。第一个是失败的使用,第二个是文件结果,用于验证上一个命令是否失败。第三个是正确使用,第四个是文件结果,用于验证上一个命令是否有效。

[i]编辑 3 或 4:实际上,看起来可以使用 来修复此问题echo "..." | xxd -r -p - "Output.bin"[/i],表示“plain”的 -p 似乎会忽略任何列限制并将完全采用 stdinput。我至少能够测试写入一个超过 1kb 的新文件。[/i]

为了澄清我所拥有的:我知道我想在此文件中修改的偏移量。xxd 做得非常好,尤其是当我只进行短暂更改时。我确切地知道我想在每个偏移量处写入的内容,但它需要将它们复制并粘贴到终端中,包括通过 xxd -p "My Bin File.bin" 打开 .bin 文件,然后将其复制粘贴到我的写入命令(echo stuff)中,删除所有换行符。

我想要实现的目标:理想的情况是能够设置一个 bash 脚本,该脚本读取“Change1.bin”、“Change2.bin”、“Change3.bin”并在每个偏移量处应用更改,或者至少提示用户(我)我想要一次写入哪些十六进制值。因此,不必输入,echo "[offset]: [bytes]" | xxd -r -c 256 - "Base File.gb"它只会提示“您想要在偏移量 0x04000 处输入什么十六进制?”。但大致相同,这就是我学习如何使用标准输出或其他参考值来获取 echo 命令的内容,而我还不知道。

编辑:尝试传递文件的一些头脑风暴:

我绞尽脑汁想使用 xxd -p "MySmallPatch.Bin" | xxd -r -c256 -s 2C29D - "Pokemon Red Linux.gb",但它不起作用,给出错误消息“抱歉,无法向后搜索”。如果我有办法执行“0002C29D:”,它可能会起作用。 xxd -p "MySmallPatch.Bin" | xxd -r -c256 - "Pokemon Red Linux.gb" 来指定该偏移量,如 echo 命令所预期的那样,但我不知道如何将该前缀设置为 bash 输出的第一部分。尝试这样做echo "0002C29D: " xxd -p "MySmallPatch.Bin"只会给出文字输出,它不会运行 xxd 命令,因此如果我尝试管道它,只会管道该文字文本。

编辑:我偶然发现了这篇关于使用 dd 命令获取输入文件并覆盖输出文件的一部分的帖子,这对我来说是朝着正确方向迈出的一步。我不认为应该有 256 字节的限制,就像 xdd 似乎有的那样。

https://unix.stackexchange.com/a/214824

我发现有 unix.stackexchange 这样的东西,我的问题可能更适合在那里提出。如果这个问题得不到回答,不用担心,我知道它并不是 Ubuntu 独有的。

答案1

忘记吧xxd。你已经找到了回答

现在我们有了二进制文件,我们知道要更改的字符串在哪里,并且我们有一个包含替换字符串的文件。

现在我们可以使用dd

dd if=tmp of=test obs=1 seek=1460 conv=notrunc

这将从tmp(我们的“ /tmp\0”文件)读取数据,并将其写入我们的二进制文件,使用 1 字节的输出块大小,在写入任何内容之前跳到我们之前找到的偏移量,并且在完成后明确不截断文件。

tmp是您的原始二进制补丁的名称。

test是您直接修补的文件(请先备份)。

唯一不存在的是,如果修补的偏移量是十六进制,则将其写为seek=$((0xoffset ))

相关内容