.TH XXD 1 "August 1996" "Manual page for xxd" .\" .\" 21st May 1996 .\" Man page author: .\" Tony Nugent .\" Changes by Bram Moolenaar .SH NAME .I xxd \- 以十六进制形式表示 .SH "总览 (SYNOPSIS)" .B xxd \-h[elp] .br .B xxd [options] [infile [outfile]] .br .B xxd \-r[evert] [options] [infile [outfile]] .SH "描述 (DESCRIPTION)" .I xxd 建立 一个 指定 文件 或者 标准 输入 的 十六 进制 转储, 同时 也 可以 把 十六 进制 转储 转换成 原来的 二进制 形式. 同 .BR uuencode(1) 和 .BR uudecode(1) 一样, 它 也可以 把 二进制 数据 转换成 ASCII 表示 形式, 这样 电子邮件 就可以 安全的 传输. 但是 它 有 一个 优点, 就是 可以 把 解码后 的 结果 输出 到 标准输出. 同时 它 还可以 用来 给 二进制 文件 打补丁. .SH "选项 (OPTIONS)" 如果 没有 给定 .I infile 就用 标准输入. 如果 .I infile 是 一个 .RB \` \- \' 字符, 也从 标准输入 读入. 如果 没有 给定 .I outfile (或者 它的 文件名 是 一个 .RB \` \- \' 字符), 结果 将 输出至 标准输出. .PP 注意 我们 用的 是 一个 很 "懒" 的 解析器, 它 只 检查 选项的 第一个 字符, 除非 这个 选项 有 参数. 在 一个 单 字符 的 选项 和 它的 参数 之间的 空格 可有可无. 选项的 参数 可以 用 十进制, 十六进制 或者 八进制的 形式 指定. 也就是说 .RB \-c8 , .BR "\-c 8" , .B \-c 010 和 .B \-cols 8 是 等价的. .PP .TP .IR \-a " | " \-autoskip 打开/关闭 autoskip: 用一个 单独的 '*' 来 代替 空行. 默认 关闭. .TP .IR \-b " | " \-bits 转到 比特(二进制 数字) 模式, 而 不是 十六进制 模式. 在 这种 模式 下, 每个 字符 被 表示成 八个 0/1 的 数字, 而 不是 一般的 十六进制 形式. 每 一行 都 以 一个 用 十六进制 形式 表示的 行号, 后面 是 ascii (或者 ebcdic) 形式 开头. 命令行 选项 \-r, \-p, \-i 在 这个 模式下 不起作用. .TP .IR "\-c cols " | " \-cols cols" .IR "\-c cols " | " \-cols cols" 每行 表示 .RI < cols > 个 字符. 默认 16 (\-i: 12, \-ps: 30, \-b: 6). 最多 256. .TP .IR \-E " | " \-EBCDIC 把 右手边的 字符 编码 从 ASCII 变为 EBCDIC. 这个 并不 改变 其 十六进制 表示 形式. 同 \-r, \-p 或者 \-i 一起用 是 没有 意义的. .TP .IR "\-g bytes " | " \-groupsize bytes" 每 .RI < bytes > 个 字符 (每 两个 十六进制 字符 或者 八个 二进制 数字) 之间 用 一个 空格 隔开. 用 .I \-g 0 禁止 分组. 在 普通 模式 中 .RI < Bytes "> 默认 是 " 2 在 二进制 模式 中 是 \fI1\fP. 分组 并不 适用于 postscript 或者 include style 选项. .TP .IR \-h " | " \-help 显示 可用 命令 概述 并且 退出. 不做 其它 任何 事情. .TP .IR \-i " | " \-include 输出 为 C 语言的 包含 文件 形式. 除非 xxd 从 标准输入 读入, 不然 会 输出 一个 完整的 静态 数组 定义(与 输入 文件 同名). .TP .IR "\-l len " | " \-len len" 输出 .RI < len > 个 字符 后 停止. .TP .IR \-p " | " \-ps " | " \-postscript " | " \-plain 以 postscript 的 连续 十六进制 转储 输出. 这 也叫做 纯 十六进制 转储. .TP .IR \-r " | " \-revert 逆向 操作: 把 十六进制 转储 转换 (或者 打补丁) 成 二进制 形式. 如果 不 输出 到 标准输出, xxd 并不把 输出 文件 截断, 而是 直接 写到 输出 文件. 用 .I \-r \-p 来 从 一个 没有 行号 没有 某种 列格式 的 纯 十六进制 转储 读入. 附加的 空格 和 换行 可以 出现 在 任何 地方. .TP .I \-seek offset 用在 .I \-r 之后: 会在 当前 文件的 偏移量 上 增加 .RI < offset > . .TP .I \-s [\+][\-]seek 从 infile 的 绝对 或者 相对 偏移量 .RI < seek > 开始. \fI\+ \fR 表示 相对于 标准 输入 当前的 位置 (如果 不是 标准输入 就 没有 意义了). \fI\- \fR 表示 从 文件 末尾 (如果 和 \fI \+ \fR 连用: 从 标准输入 当前 位置) 向前 数 一些 字符, 从 那个 地方 开始. 如果 没有 \-s 选项, xxd 从 当前 位置 开始. .TP .I \-u 用大写字母. 默认的是小写字母. .TP .IR \-v " | " \-version 显示 版本 字符串. .SH "告诫 (CAVEATS)" .PP .I xxd \-r 在 对待 行号 上 有一些 地方 值得 注意. 如过 输出 文件 可以 定位, 那么 在 十六进制 文件 中的 行首的 行号 可以 重叠, 顺序 可以 打乱, 还 可以 略去 一些 行号. 这种 情况 下, xxd 会 用 lseek(2) 来 定位. 如果 输出 文件 不可以 定位, 那么 行号 可以 不连续, 但是 必须 按 顺序, 这种 情况 下, 中间 会 插入 null 字符. .PP .I xxd \-r 从不 输出 解析 错误. 错误 会 被跳过. .PP 在 编辑 十六进制 文件时 要 注意 .I xxd \-r 在 读入 足够列 之后 会跳过 本行 后面 所有的 数据 (见 选项 \-c). 这 就是说 对可打印的 ASCII (或者 EBCDIC) 的修改 都会被 忽略. 用 xxd \-r \-p 把一个 纯十六进制 转储文件 (或者 postscript) 恢复 成 二进制文件 与 列数 是否 正确 没有 什么 关系, 它会 解释 所有 看起来 像 两个 十六进制的 数字. .PP 请 注意 .br \fI% xxd \-i file\fR .br 和 .br \fI% xxd \-i \< file\fR 的 区别. .PP 因为 lseek(2) 是 用来 重置 输入指针的, 所以 .I xxd \-s \+seek 和 .I xxd \-s seek 是 有区别的. 如果 输入 是 标准输入, 并且 在 xxd 被执行是 它的 标准输入的 指针 位置 不是在 文件的 开头, 那么 多了个 '+' 效果 就会 不一样了. 下面的 例子 可能 帮助你 弄清楚(也可能 让你 更糊涂)... .PP 在读 之前 需要 重置 输入的 文件指针; 因为 `cat' 已经 读到了 输入的 文件尾. .br \fI% sh \-c 'cat > plain_copy; xxd \-s 0 > hex_copy' < file .PP 从 0x480 (=1024+128) 开始读. `+' 表明 "相对于 当前的 文件位置", 也就是说 从 dd 读了 1k, 在此 基础上 再加 `128'. .br \fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +128 > hex_snippet' < file .PP 从 0x100 ( = 1024-768) 开始读. .br \fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +-768 > hex_snippet' < file .PP 可是, 这种 情况 很少 发生, 我们 也 很少 需要用 `+'. 当用了 \-s 是, 作者 比较 喜欢 用 strace(1) 或者 truss(1) 去 监控 xxd 的 行为. .SH "例子 (EXAMPLES)" .PP .br (译者: 实际 输出 可能 和 例子 有 一些 出入, 只要 理解 其 意思 就行了) .br 显示 \fBfile\fP 除了 前 三行 (十六进制 的 0x30) 的 所有 内容. .br \fI% xxd \-s 0x30 file .PP .br 显示 \fBfile\fP 最后 三行 (十六进制 的 0x30) 的 所有 内容. .br \fI% xxd \-s \-0x30 file .PP .br 显示 120 个 字符, 每行 20 个 字符, 连续 显示. .br \fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR .br 2e544820585844203120224d616e75616c207061 .br 676520666f7220787864220a2e5c220a2e5c2220 .br 32317374204d617920313939360a2e5c22204d61 .br 6e207061676520617574686f723a0a2e5c222020 .br 2020546f6e79204e7567656e74203c746f6e7940 .br 7363746e7567656e2e7070702e67752e6564752e .br .br 显示 120 个 字符, 每行 12 个 字符. .br \fI% xxd \-l 120 \-c 12 xxd.1\fR .br 0000000: 2e54 4820 5858 4420 3120 224d .TH XXD 1 "M .br 000000c: 616e 7561 6c20 7061 6765 2066 anual page f .br 0000018: 6f72 2078 7864 220a 2e5c 220a or xxd"..\\". .br 0000024: 2e5c 2220 3231 7374 204d 6179 .\\" 21st May .br 0000030: 2031 3939 360a 2e5c 2220 4d61 1996..\\" Ma .br 000003c: 6e20 7061 6765 2061 7574 686f n page autho .br 0000048: 723a 0a2e 5c22 2020 2020 546f r:..\\" To .br 0000054: 6e79 204e 7567 656e 7420 3c74 ny Nugent output_file\fR .br .br 给 文件 xxd.1 中的 日期 打 补钉. .br \fI% echo '0000029: 3574 68' | xxd \-r \- xxd.1\fR .br \fI% xxd \-s 0x28 \-l 12 \-c 12 xxd.1\fR .br 0000028: 3235 7468 204d 6179 2031 3939 25th May 199 .PP .br 建立 一个 65537 字节的 文件, 所有 字节 都是 0x00, 除了 最后 一个 字节 是 'A' (十六进制 0x41). .br \fI% echo \'010000: 41\' | xxd \-r \> file\fR .PP .br 打开 autoskip, 显示 上例 中 建立的 文件. .br \fI% xxd \-a \-c 12 file\fR .br 0000000: 0000 0000 0000 0000 0000 0000 ............ .br * .br 000fffc: 0000 0000 40 ....A .PP 建立 一个 只 含有 一个 'A' 的 文件. '\-r \-s' 后面 的 数字 同 文件 中的 行号 相 抵消; 结果是 开头 的 字节 被 跳过了. .br \fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> file\fR .PP 在 编辑器, 比如 .B vim(1) 中 把 xxd 当成 一个 过滤 程序 来用, 用 十六进制 来 显示 被 标记 为 'a' 和 'z' 中间 的 区域. .br \fI:'a,'z!xxd\fR .PP 在 编辑器, 比如 .B vim(1) 中 把 xxd 当成 一个 过滤 程序 来用, 用来 恢复 被 标记 为 'a' 和 'z' 中间 的 区域 的 十六进制 显示. .br \fI:'a,'z!xxd \-r\fR .PP 在 编辑器, 比如 .B vim(1) 中 把 xxd 当成 一个 过滤 程序 来用, 用来 恢复 一行的 十六进治 显示. 把 光标 移动 到 相应行 并 键入: .br \fI!!xxd \-r\fR .PP 从 串行线 中 读入 一个个的 单独的 字符. .br \fI% xxd \-c1 < /dev/term/b &\fR .br \fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR .br \fI% echo \-n foo > /dev/term/b\fR .PP .SH "返回值 (RETURN VALUES)" 此 程序 返回 如下的 错误码: .TP 0 一切 正常. .TP \-1 不支持 此 操作 ( .I xxd \-r \-i 仍然 不行). .TP 1 解析 选项 错误. .TP 2 输入 文件 出错. .TP 3 输出 文件 出错. .TP 4,5 指定 的 偏移量 地址 不可 到达. .SH "参见 (SEE ALSO)" uuencode(1), uudecode(1), patch(1) .br .SH "警告 (WARNINGS)" 这个 工具 古怪的 念头 是其 作者的 意思. 使用 这个 工具的 任何 结果 都由 自己 负责. 使用它, 探索它, 你 终会 成为 一个 高手. .br .SH "版本 (VERSION)" 此 手册页 为 1.7 版本的 xxd 而写. .SH "作者 (AUTHOR)" .br (c) 1990-1997 by Juergen Weigert .br .LP Distribute freely and credit me, .br make money and share with me, .br lose money and don't ask me. .PP Tony Nugent .br 最先 开始 写 本 手册页 .br Bram Moolenaar 做了 一些 小的 改动. Juergen Weigert 完成了 手册页 的 编写. .PP .SH "[中文版维护人]" .B 唐友 \ .SH "[中文版最新更新]" .BR 2002/1/22 .SH "[中国Linux论坛man手册页翻译计划]" .BI http://cmpp.linuxforum.net