将标准输入和输出与二进制数据一起使用是否安全?


14

我需要将一个二进制文件一分为二。我想知道是否可以使用头和/或尾,但是我想知道...对二进制数据使用重定向,管道等是否安全?新行是否引起混乱,是否忽略了null,退格或删除是否有特殊之处?(bash,kubuntu 18.04 LTS)


1
看一下split命令。
egmont

Answers:


19

是的,如果将其通过管道传输到另一个进程或将其保存到文件中,这是安全的。如果让二进制标准输出打印到终端,则可能会出现“怪异”现象,因为它可能包含(随机)转义序列,这些转义序列会暂时使终端显示混乱。


6
在这种情况下,您可以键入reset并按Enter进行修复。
Baard Kopperud

4
@BaardKopperud我以为我读了一些关于tset / reset无法正常工作的
极端

1
@ Xen2050我不知道。唯一的情况是如果某些转义序列更改了键盘布局/编码,以便键入reset<enter> 实际上不会键入终端所看到的那个字符序列……
Bakuriu

3
另请参阅在显示二进制文件后修复终端以及为什么有时需要在CTRL + C之后重置控制台。正如第一个链接中所建议的那样stty sane; tput rs1,命令序列将在某些极端情况下无法解决问题时reset发挥作用。除了Bakuriu提到的这种情况外,还可能包括终端线/列的宽度,或者我猜想与串行通信相关的设置(波特率/奇偶校验)。
Sergiy Kolodyazhnyy

1

使用诸如head或的命令的主要问题tail是它们是面向行的,而二进制文件不是。如果它们中确实包含换行符,则通常不使用它们来表示行尾,如果包含换行符,则它们可能只是诸如程序消息或数据字段之类的字符串的一部分。

如果以任何方式构造数据,那么在选择分割点时都必须考虑到这一点,这样就不会破坏中间的结构。

如果您知道文件的结构,则可以使用以下命令

dd -if input-file -of output-file ...

提供仅从特定(增量)偏移量开始复制这么多特定大小数据块的选项到文件中。

看起来split@egmont提到的命令将为您自动执行此过程,但是默认情况下它似乎是面向行的,因此您必须指定其他选项,例如--bytes count告诉它文件的每个部分应多大是。


附带说明一下,如果您不知道文件中有什么内容,但怀疑它至少包含一些有意义的文本数据,则此strings命令是一种很好的方式,它可以让您先查看要处理的内容。

strings -n 6 file | less

将查找所有至少六个字符长的可打印字符,并将其显示在寻呼机中,以免它们在终端上飞过。使用比默认的4个字符大一点的数字有助于消除微小的数据片段,这些数据片段恰好是可打印的,但在文件中并未以这种方式使用。

如果以后需要使用二进制编辑器(例如)更详细地探索文件,则将hexedit具有一些标志性作用,指出可能会发现有趣的地方。

strings有一个选项- t x 将在每个打印的字符串之前以十六进制的偏移量进入文件,(o表示八进制,d表示十进制),因此您知道以后可以在哪里找到它。当您必须逐个字符地查看它们时,即使是非常短的文件也要处理很多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.