注意 我们 用的 是 一个 很 "懒" 的 解析器, 它 只 检查 选项的 第一个 字符, 除非 这个 选项 有 参数. 在 一个 单 字符 的 选项 和 它的 参数 之间的 空格 可有可无. 选项的 参数 可以 用 十进制, 十六进制 或者 八进制的 形式 指定. 也就是说 -c8, -c 8, -c 010 和 -cols 8 是 等价的.
xxd -r 在 对待 行号 上 有一些 地方 值得 注意. 如过 输出 文件 可以 定位, 那么 在 十六进制 文件 中的 行首的 行号 可以 重叠, 顺序 可以 打乱, 还 可以 略去 一些 行号. 这种 情况 下, xxd 会 用 lseek(2) 来 定位. 如果 输出 文件 不可以 定位, 那么 行号 可以 不连续, 但是 必须 按 顺序, 这种 情况 下, 中间 会 插入 null 字符.
xxd -r 从不 输出 解析 错误. 错误 会 被跳过.
在 编辑 十六进制 文件时 要 注意 xxd -r 在 读入 足够列 之后 会跳过 本行 后面 所有的 数据 (见 选项 -c). 这 就是说 对可打印的 ASCII (或者 EBCDIC) 的修改 都会被 忽略. 用 xxd -r -p 把一个 纯十六进制 转储文件 (或者 postscript) 恢复 成 二进制文件 与 列数 是否 正确 没有 什么 关系, 它会 解释 所有 看起来 像 两个 十六进制的 数字.
请 注意
% xxd -i file
和
% xxd -i < file
的 区别.
因为 lseek(2) 是 用来 重置 输入指针的, 所以 xxd -s +seek 和 xxd -s seek 是 有区别的. 如果 输入 是 标准输入, 并且 在 xxd 被执行是 它的 标准输入的 指针 位置 不是在 文件的 开头, 那么 多了个 '+' 效果 就会 不一样了. 下面的 例子 可能 帮助你 弄清楚(也可能 让你 更糊涂)...
在读 之前 需要 重置 输入的 文件指针; 因为 `cat' 已经 读到了 输入的 文件尾.
% sh -c 'cat > plain_copy; xxd -s 0 > hex_copy' < file
从 0x480 (=1024+128) 开始读. `+' 表明 "相对于 当前的 文件位置", 也就是说
从 dd 读了 1k, 在此 基础上 再加 `128'.
% sh -c 'dd of=plain_snippet bs=1k count=1; xxd -s +128 > hex_snippet' < file
从 0x100 ( = 1024-768) 开始读.
% sh -c 'dd of=plain_snippet bs=1k count=1; xxd -s +-768 > hex_snippet' < file
可是, 这种 情况 很少 发生, 我们 也 很少 需要用 `+'. 当用了 -s 是, 作者 比较 喜欢 用 strace(1) 或者 truss(1) 去 监控 xxd 的 行为.
(译者: 实际 输出 可能 和 例子 有 一些 出入, 只要 理解 其 意思 就行了)
显示 file 除了 前 三行 (十六进制 的 0x30) 的 所有 内容.
% xxd -s 0x30 file
显示 file 最后 三行 (十六进制 的 0x30) 的 所有 内容.
% xxd -s -0x30 file
显示 120 个 字符, 每行 20 个 字符, 连续 显示.
% xxd -l 120 -ps -c 20 xxd.1
2e544820585844203120224d616e75616c207061
676520666f7220787864220a2e5c220a2e5c2220
32317374204d617920313939360a2e5c22204d61
6e207061676520617574686f723a0a2e5c222020
2020546f6e79204e7567656e74203c746f6e7940
7363746e7567656e2e7070702e67752e6564752e
显示 120 个 字符, 每行 12 个 字符.
% xxd -l 120 -c 12 xxd.1
0000000: 2e54 4820 5858 4420 3120 224d .TH XXD 1 "M
000000c: 616e 7561 6c20 7061 6765 2066 anual page f
0000018: 6f72 2078 7864 220a 2e5c 220a or xxd"..\".
0000024: 2e5c 2220 3231 7374 204d 6179 .\" 21st May
0000030: 2031 3939 360a 2e5c 2220 4d61 1996..\" Ma
000003c: 6e20 7061 6765 2061 7574 686f n page autho
0000048: 723a 0a2e 5c22 2020 2020 546f r:..\" To
0000054: 6e79 204e 7567 656e 7420 3c74 ny Nugent <t
0000060: 6f6e 7940 7363 746e 7567 656e ony@sctnugen
000006c: 2e70 7070 2e67 752e 6564 752e .ppp.gu.edu.
只 显示 xxd.1 中 的 日期.
% xxd -s 0x28 -l 12 -c 12 xxd.1
0000028: 3231 7374 204d 6179 2031 3939 21st May 199
把
input_file
考到
output_file
并 在 前面 增加 100 个 字节的 0x00.
% xxd input_file | xxd -r -s 100 > output_file
给 文件 xxd.1 中的 日期 打 补钉.
% echo '0000029: 3574 68' | xxd -r - xxd.1
% xxd -s 0x28 -l 12 -c 12 xxd.1
0000028: 3235 7468 204d 6179 2031 3939 25th May 199
建立 一个 65537 字节的 文件, 所有 字节 都是 0x00,
除了 最后 一个 字节 是 'A' (十六进制 0x41).
% echo '010000: 41' | xxd -r > file
打开 autoskip, 显示 上例 中 建立的 文件.
% xxd -a -c 12 file
0000000: 0000 0000 0000 0000 0000 0000 ............
*
000fffc: 0000 0000 40 ....A
建立 一个 只 含有 一个 'A' 的 文件. '-r -s' 后面 的
数字 同 文件 中的 行号 相 抵消; 结果是 开头 的 字节 被
跳过了.
% echo '010000: 41' | xxd -r -s -0x10000 > file
在 编辑器, 比如
vim(1)
中 把 xxd 当成 一个 过滤 程序 来用, 用 十六进制 来 显示
被 标记 为 'a' 和 'z' 中间 的 区域.
:'a,'z!xxd
在 编辑器, 比如
vim(1)
中 把 xxd 当成 一个 过滤 程序 来用, 用来 恢复
被 标记 为 'a' 和 'z' 中间 的 区域 的 十六进制 显示.
:'a,'z!xxd -r
在 编辑器, 比如
vim(1)
中 把 xxd 当成 一个 过滤 程序 来用, 用来 恢复 一行的
十六进治 显示. 把 光标 移动 到 相应行 并 键入:
!!xxd -r
从 串行线 中 读入 一个个的 单独的 字符.
% xxd -c1 < /dev/term/b &
% stty < /dev/term/b -echo -opost -isig -icanon min 1
% echo -n foo > /dev/term/b