NAME¶
xxd -
以十六进制形式表示
总览 (SYNOPSIS)¶
xxd -h[elp]
xxd [options] [infile [outfile]]
xxd -r[evert] [options] [infile [outfile]]
描述 (DESCRIPTION)¶
xxd 建立 一个 指定 文件
或者 标准 输入 的 十六
进制 转储, 同时 也 可以
把 十六 进制 转储
转换成 原来的 二进制
形式. 同
uuencode(1) 和
uudecode(1)
一样, 它 也可以 把
二进制 数据 转换成 ASCII
表示 形式, 这样
电子邮件 就可以
安全的 传输. 但是 它 有
一个 优点, 就是 可以 把
解码后 的 结果 输出 到
标准输出. 同时 它
还可以 用来 给 二进制
文件 打补丁.
选项 (OPTIONS)¶
如果 没有 给定
infile
就用 标准输入. 如果
infile 是 一个 `
-´ 字符,
也从 标准输入 读入.
如果 没有 给定
outfile
(或者 它的 文件名 是
一个 `
-´ 字符), 结果
将 输出至 标准输出.
注意 我们 用的 是 一个
很 "懒" 的 解析器, 它
只 检查 选项的 第一个
字符, 除非 这个 选项 有
参数. 在 一个 单 字符 的
选项 和 它的 参数
之间的 空格 可有可无.
选项的 参数 可以 用
十进制, 十六进制 或者
八进制的 形式 指定.
也就是说 -c8
, -c 8,
-c 010
和
-cols 8 是 等价的.
- -a | -autoskip
- 打开/关闭 autoskip: 用一个
单独的 '*' 来 代替 空行.
默认 关闭.
- -b | -bits
- 转到 比特(二进制
数字) 模式, 而 不是
十六进制 模式. 在
这种 模式 下, 每个
字符 被 表示成 八个 0/1
的 数字, 而 不是
一般的 十六进制
形式. 每 一行 都 以
一个 用 十六进制
形式 表示的 行号,
后面 是 ascii (或者 ebcdic) 形式
开头. 命令行 选项 -r, -p, -i
在 这个 模式下
不起作用.
- -c cols | -cols cols
- -c cols | -cols cols 每行 表示
<cols> 个 字符. 默认 16 (-i:
12, -ps: 30, -b: 6). 最多 256.
- -E | -EBCDIC
- 把 右手边的 字符
编码 从 ASCII 变为 EBCDIC. 这个
并不 改变 其
十六进制 表示 形式.
同 -r, -p 或者 -i 一起用 是
没有 意义的.
- -g bytes | -groupsize bytes
- 每 <bytes> 个 字符 (每
两个 十六进制 字符
或者 八个 二进制
数字) 之间 用 一个
空格 隔开. 用 -g 0 禁止
分组. 在 普通 模式 中
<Bytes> 默认 是 2 在
二进制 模式 中 是 1.
分组 并不 适用于 postscript
或者 include style 选项.
- -h | -help
- 显示 可用 命令 概述
并且 退出. 不做 其它
任何 事情.
- -i | -include
- 输出 为 C 语言的 包含
文件 形式. 除非 xxd 从
标准输入 读入, 不然
会 输出 一个 完整的
静态 数组 定义(与
输入 文件 同名).
- -l len | -len len
- 输出 <len> 个 字符 后
停止.
- -p | -ps | -postscript | -plain
- 以 postscript 的 连续
十六进制 转储 输出.
这 也叫做 纯
十六进制 转储.
- -r | -revert
- 逆向 操作: 把
十六进制 转储 转换
(或者 打补丁) 成
二进制 形式. 如果 不
输出 到 标准输出, xxd
并不把 输出 文件
截断, 而是 直接 写到
输出 文件. 用 -r -p 来 从
一个 没有 行号 没有
某种 列格式 的 纯
十六进制 转储 读入.
附加的 空格 和 换行
可以 出现 在 任何
地方.
- -seek offset
- 用在 -r 之后: 会在
当前 文件的 偏移量
上 增加 <offset>.
- -s [+][-]seek
- 从 infile 的 绝对 或者
相对 偏移量 <seek>
开始. + 表示 相对于
标准 输入 当前的
位置 (如果 不是
标准输入 就 没有
意义了). - 表示 从
文件 末尾 (如果 和 +
连用: 从 标准输入
当前 位置) 向前 数
一些 字符, 从 那个
地方 开始. 如果 没有 -s
选项, xxd 从 当前 位置
开始.
- -u
- 用大写字母.
默认的是小写字母.
- -v | -version
- 显示 版本 字符串.
告诫 (CAVEATS)¶
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 的
行为.
例子 (EXAMPLES)¶
(译者: 实际 输出 可能 和
例子 有 一些 出入, 只要
理解 其 意思 就行了)
显示
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
返回值 (RETURN VALUES)¶
此 程序 返回 如下的
错误码:
- 0
- 一切 正常.
- -1
- 不支持 此 操作 ( xxd -r -i
仍然 不行).
- 1
- 解析 选项 错误.
- 2
- 输入 文件 出错.
- 3
- 输出 文件 出错.
- 4,5
- 指定 的 偏移量 地址
不可 到达.
参见 (SEE ALSO)¶
uuencode(1),
uudecode(1),
patch(1)
警告 (WARNINGS)¶
这个 工具 古怪的 念头
是其 作者的 意思. 使用
这个 工具的 任何 结果
都由 自己 负责. 使用它,
探索它, 你 终会 成为
一个 高手.
版本 (VERSION)¶
此 手册页 为 1.7 版本的 xxd
而写.
作者 (AUTHOR)¶
(c) 1990-1997 by Juergen Weigert
<jnweiger@informatik.uni-erlangen.de>
Distribute freely and credit me,
make money and share with me,
lose money and don't ask me.
Tony Nugent
<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
最先 开始 写 本 手册页
Bram Moolenaar 做了 一些 小的
改动. Juergen Weigert 完成了
手册页 的 编写.
[中文版维护人]¶
唐友 <tony_ty@263.net>
[中文版最新更新]¶
2002/1/22
[中国Linux论坛man手册页翻译计划]¶
http://cmpp.linuxforum.net