Mar*_*ark 7 ls filesystems hexdump
我有一个我创建的文件(在 vim 中),用于测试目的(在 SSH 客户端中测试 UTF-8 输出)。然而,这个文件正在发生奇怪的事情。
我想知道文件中有哪些字节,所以我使用了hexdump:
username@computername:~$ hexdump -x intl.txt
0000000 9ecf 000a
0000003
Run Code Online (Sandbox Code Playgroud)
好的,那里有四个字节,00 和 0a 是如何进入的,我不清楚,但无论如何。不过,这就是它变得奇怪的地方:
username@computername:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt
Run Code Online (Sandbox Code Playgroud)
等等,是三个字节?这里发生了什么?
好像这还不够奇怪,hexdump -C给出了非常不同的输出:
username@computername:~$ hexdump -C intl.txt
00000000 cf 9e 0a |...|
00000003
Run Code Online (Sandbox Code Playgroud)
Vim 也对这个文件有点困惑。当我启动它时,它在状态行中给出:
"intl.txt" 1L, 3C
Run Code Online (Sandbox Code Playgroud)
然而,最重要的是,我得到了这个(使用set list):
?$
~
~
~
~
Run Code Online (Sandbox Code Playgroud)
所以,它认为有 3 个字符,但只打印一个。我可以理解它是否打印了 koppa 和它下面的空白行...
Gra*_*eme 10
正如其他人指出的那样,这是因为hexdump -x将文件视为包含 2 个字节的单词。在小端系统上(几乎所有桌面都是),这意味着字节将在显示之前交换。这意味着字节值成对打印并且这些字节的顺序被交换。由于您有奇数个字节,hexdump只需添加一个零即可组成最后一对。然后将零与 交换0a。这是 记录在案的行为hexdump,因此它不会对您说谎!
Usinghexdump -C是获得格式化输出的更好命令,该输出按字节在文件中的顺序显示。也是0a一个新行,可能是由创建文件的任何人悄悄添加的(vim默认情况下这样做)。例如,echo如果你不告诉它不要,它总是会添加一个新行。在bash:
echo -e '\xcf\x9e' | hexdump -C
Run Code Online (Sandbox Code Playgroud)
将给出相同的结果,但用 with 抑制换行符-n将给出您期望的结果:
echo -ne '\xcf\x9e' | hexdump -C
Run Code Online (Sandbox Code Playgroud)
要停止vim添加换行符:
:set noeol
:set binary
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1838 次 |
| 最近记录: |