如何在 Linux 中将 8 个字节的数据添加到二进制文件?

如何在 Linux 中将 8 个字节的数据添加到二进制文件?

我想在二进制文件的开头添加 8 个字节的数据。

有没有用于此的 Linux 命令?

答案1

这是实现此目的的一种方法。

printf "\x68\x65\x6c\x6c\x6f\x20\x77\x6f" | cat - oldfile > newfile

的参数printf是十六进制的 8 个字节序列。只需将我使用的值(即 ASCII 字符“hello wo”)替换为您的值即可。

答案2

它不是‘那个’命令,而是‘一堆命令’(按照古老的 unix 传统):

  • 把你的 8 个字节放到一个文件中
  • 将原始文件附加到该文件
  • 将新文件重命名为原始文件的名称。

或者:

% echo -n "12345689" > new_file
% cat original >> new_file
% mv new_file original

或者,如果您需要从其他地方读取这 8 个字节:

% dd if=inputstream of=new_file bs=1 count=8

然后按上述步骤继续。

答案3

这不是对原始问题的正确回答,而仅仅是针对@mxmlnkn 评论中非常恰当的关注做出的评论

因此,我需要在 120GB 的文件前面添加 256kB,并且我不想等待 30 分钟来完全复制和写入整个 120GB……没有办法吗?

在网上搜索“fallocate prepend to file”,这应该会向你显示一些基于 StackExchange 的答案(编辑:例如https://stackoverflow.com/a/37884191/9378469)。

鉴于 Linux 4.1+ (XFS) 或 4.2+ (XFS, ext4),fallocate 方法允许您在文件中插入文件系统页面大小的空洞,希望在恒定时间内完成。对于您的问题,这可能足够灵活,也可能不够灵活。

答案4

要将数据添加到二进制文件前面,请增加文件大小,然后添加数据:

xxd file.old | xxd -r -s 8 > file.new; 
data="e.i..ght"; 
echo -n $data | xxd -p | xxd -r -p - file.new

旧文件

00000000  00 00 00 13 02 d1 20 83  00 73 02 b3 00 73 04 33  |...... ..s...s.3|
00000010  00 73 64 b3 00 00 00 13                           |.sd.....|
00000018

新建文件

00000000  65 2e 69 2e 2e 67 68 74  00 00 00 13 02 d1 20 83  |e.i..ght...... .|
00000010  00 73 02 b3 00 73 04 33  00 73 64 b3 00 00 00 13  |.s...s.3.sd.....|
00000020

相关内容