上一篇写完 hyperfine 之后预告过,这次实测 sharkdp/hexyl(读星数约 1.03 万,2026-11-07)。
查 ELF、抠协议、对一下「文件头到底是不是 7f 45 4c 46」,很多人第一反应是 xxd、od -Ax -tx1z 或 hexdump -C。能用,但默认输出偏「给机器看」:ASCII 侧一律用 . 糊弄非打印字节,也没有按字节类别上色。hexyl 是同一作者(sharkdp)做的终端十六进制查看器,默认双面板 + 右侧字符区,用 ⋄ / • / × 等符号区分 NULL、控制字符和非 ASCII。我在本机把它和 xxd / od / BusyBox hexdump -C 正面比了一轮,并把管道、-p、--panels、大文件和 NO_COLOR 都踩了一遍。
本机实测 + AI 辅助整理。测量时间:2026-11-07(Asia/Shanghai)。大文件墙钟用 hyperfine 2.0.0(
-S -w … -r …),文内关键对比写 中位数(JSON schema 2);输出重定向到/dev/null,文件在页缓存里。本机环境默认带有NO_COLOR=1(文内单独说明)。
本机环境
OS: Debian 13 x86_64,8 核
hexyl: 0.17.0(GitHub release 二进制)
xxd: 2024-12-07(Debian 包 xxd 抽出;本机 apt 无 xxd)
od: GNU coreutils 9.7
hexdump: BusyBox 1.35.0(本机 apt 无 bsdextrautils)
安装又踩了和 bat / hyperfine 一样的 apt 坑:
$ sudo apt-get install -y hexyl
E: Unable to locate package hexyl
官方 README 写 Debian Buster+ 可以 apt-get install hexyl,本机 Debian 13 源里当天就是没有。改走官方 release:
curl -sL -o hexyl.tar.gz \
https://github.com/sharkdp/hexyl/releases/download/v0.17.0/hexyl-v0.17.0-x86_64-unknown-linux-gnu.tar.gz
tar xzf hexyl.tar.gz
mkdir -p ~/.local/bin
cp hexyl-v0.17.0-x86_64-unknown-linux-gnu/hexyl ~/.local/bin/hexyl
hexyl --version # hexyl 0.17.0
macOS 一般是 brew install hexyl。下文统一写 hexyl。对照用的 xxd 本机 apt 也装不到,是从 Debian xxd_*.deb 抽出二进制;hexdump -C 用 BusyBox 多调用——所以文中 hexdump 数字标成 BusyBox,不跟 util-linux 的 hexdump 混为一谈。
测试素材
| 文件 | 大小 | 用途 |
|---|---|---|
hello.txt | 38 B | 文本 + Tab + UTF-8 中文 |
all_bytes.bin | 256 B | 0x00~0xff 各一字节 |
hexyl_elf.bin | ≈1.23 MiB | 本机 hexyl 可执行文件本身 |
1MiB.bin / 8MiB.bin | 1 / 8 MiB | 整文件转储吞吐 |
zeros_4k.bin | 4 KiB 全零 | 看默认「挤相同行」 |
实测 1:同一段 ELF 头,四种工具长什么样
取 hexyl 自己的前 64 字节(标准 ELF:7f 45 4c 46…)。hexyl --color=never:
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
│00000000│ 7f 45 4c 46 02 01 01 00 ┊ 00 00 00 00 00 00 00 00 │•ELF•••⋄┊⋄⋄⋄⋄⋄⋄⋄⋄│
│00000010│ 03 00 3e 00 01 00 00 00 ┊ 10 ff 00 00 00 00 00 00 │•⋄>⋄•⋄⋄⋄┊•×⋄⋄⋄⋄⋄⋄│
│00000020│ 40 00 00 00 00 00 00 00 ┊ 28 94 13 00 00 00 00 00 │@⋄⋄⋄⋄⋄⋄⋄┊(ו⋄⋄⋄⋄⋄│
│00000030│ 00 00 00 00 40 00 38 00 ┊ 0a 00 40 00 20 00 1d 00 │⋄⋄⋄⋄@⋄8⋄┊_⋄@⋄ ⋄•⋄│
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘
同段 xxd / od -Ax -tx1z / BusyBox hexdump -C:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
# od / hexdump -C 也是每行 16 字节 + 右侧 ASCII,非打印一律 '.'
可读性差别不在「能不能看出 ELF」——四种都能;差别在:
| 项 | hexyl 默认 | xxd / od / hexdump -C |
|---|---|---|
| 每行字节 | 16(两块 8 字节面板) | 通常也是 16 |
| 右侧字符 | 分类符号:⋄ NULL、• 控制、_ 空白、× 非 ASCII | 多半统一 . |
| 边框 | Unicode 表格 | 无 |
| 颜色 | 可按字节类别着色(见踩坑) | 无 |
看协议/魔数时,hexyl 右侧不会把 0x00 和 0xff 糊成同一个点,扫一眼更省事。
实测 2:默认双面板、--panels、窄终端
本机不设宽度时,hexyl 默认 2 个 hex 面板(共 16 字节/行),和 xxd 默认列数一致。显式拉开:
hexyl --color=never --panels=1 -n 32 all_bytes.bin # 每行 8 字节
hexyl --color=never --panels=4 -n 64 all_bytes.bin # 每行 32 字节(要够宽)
hexyl --color=never --terminal-width 40 -n 32 all_bytes.bin # 自动收成 1 面板
本机 --terminal-width 40 时确实掉成单面板;但 --terminal-width 不能和 --panels 一起用,会直接报错(见踩坑)。
字符表可用 --character-table=ascii 改成更接近 xxd 的 . 风格;默认那套符号更利于「分类扫读」。
实测 3:大文件转储——标题里的 102ms / 696ms
热缓存、整文件 dump 到 /dev/null(hyperfine 中位数):
1 MiB
| 命令 | 中位数 |
|---|---|
hexyl -p | 5.5 ms |
xxd | 8.0 ms |
hexyl --color=never | 11.8 ms |
hexyl --color=force(强制 ANSI) | 20.4 ms |
od -Ax -tx1z | 85.3 ms |
BusyBox hexdump -C | 344.7 ms(约 29× never) |
8 MiB
| 命令 | 中位数 | 相对 hexyl never |
|---|---|---|
hexyl -p | 50.8 ms | ≈0.5× |
xxd | 72.5 ms | ≈0.7× |
hexyl --color=never | 101.8 ms | 1× |
hexyl --color=force | 171.1 ms | ≈1.7× |
od -Ax -tx1z | 695.6 ms | ≈6.8× |
只看前 64 KiB(更接近「打开瞄一眼」)时,xxd -l 65536 中位约 0.79 ms,hexyl --color=never -n 64KiB 约 1.5 ms,od -N 65536 约 6.8 ms——局部查看大家都很快,差距主要出现在整文件刷完。
256 字节全谱文件的输出体积也能侧面说明装饰成本:
| 命令 | 输出字节 |
|---|---|
hexyl -p | 864 |
xxd | 1088 |
od -Ax -tx1z | 1207 |
BusyBox hexdump -C | 1273 |
hexyl --color=never(带框+字符区) | 2156 |
可复现:
cat 8MiB.bin >/dev/null # 预热
hyperfine -S -w 1 -r 5 \
'hexyl --color=never 8MiB.bin >/dev/null' \
'xxd 8MiB.bin >/dev/null' \
'od -Ax -tx1z 8MiB.bin >/dev/null'
实测 4:管道、挤行、-n / -s
管道输入正常(v0.17 起也支持显式 -):
printf 'Hello via pipe\x00\x01\xff' | hexyl --color=never -n 32
# 右侧能直接看到 ⋄(NULL)和 ×(0xff)
空输入会画一张表并写 No content,退出码仍是 0——脚本里别只靠「有没有表格」判断是否读到数据。
全零 4 KiB:默认会像 xxd 一样挤掉相同行(本机 5 行收工);hexyl -v / --no-squeezing 则展开到 258 行。大块 padding / 稀疏文件先别加 -v,否则终端会刷爆。
-n 1KiB、-s 0x100 这类带单位/十六进制的长度参数本机可用。从末尾回退要用 --skip=-16(或 -- -16 那套路),直接 -s -16 会被当成「未知短选项 -1」——见踩坑。
实测 5:文本里的 UTF-8 与「字符区不是解码器」
hello.txt 里有中文「中文UTF8」。hexyl 右侧不会把多字节 UTF-8 拼成汉字,而是按单字节分类——所以会看到一串 ×,再夹杂 ASCII 的 UTF8。这和 xxd 右侧一排 . 是同一层抽象:字符区是「字节分类预览」,不是 iconv。
对本机这段:
│00000010│ 6e 65 32 09 54 61 62 62 ┊ 65 64 0a e4 b8 ad e6 96 │ne2_Tabb┊ed_×××××│
│00000020│ 87 55 54 46 38 0a ┊ │×UTF8_ ┊ │
09(Tab)显示成 _,0a(换行)也是空白类;e4 b8 ad e6 96 87 六个非 ASCII 字节全是 ×。想确认「文件里是不是这几个 UTF-8 字节」够用;想「读出汉字」请用编辑器或 iconv,别指望 hex 查看器右侧。
另外 --character-table=ascii 可以把右侧改成更接近 xxd 的 . 风格;codepage-437 / codepage-1047 则换映射表。需要喂给 C 源码时还有 -i / --include(C include 数组风格),和 xxd -i 同场景。
踩坑清单(都在本机碰到过)
坑 1:apt 找不到 hexyl(以及本机也没有 xxd)
E: Unable to locate package hexyl
和 bat / hyperfine 同一结论:别在残缺源里死磕,下 GitHub release 或官方 .deb。额外一记:本机 apt 同样没有 xxd / bsdextrautils,对照实验前要先解决「对照工具从哪来」。
坑 2:环境有 NO_COLOR=1 时,--color=always 也不上色
本机默认导出了 NO_COLOR=1。此时:
hexyl --color=always重定向后 0 个 ESC(和 never 一样大)- 去掉
NO_COLOR后,--color=always重定向会出现 ANSI --color=auto在重定向时仍然不上色(符合「非 TTY」)- 只有
--color=force明确覆盖NO_COLOR
很多人 CI、IDE、容器会注入 NO_COLOR。你以为开了 always,截图却一片素——先 env | grep NO_COLOR,再考虑要不要 force。1 MiB 上:never 中位约 11.8 ms;去掉 NO_COLOR 的 always / force 约 21 ms(大约 1.6~1.7×),着色不是免费的。
坑 3:hexyl -p ≠ xxd -p
hexyl 的 -p / --plain 是:关掉字符区、偏移、边框,并 color=never,仍按字节分组打印十六进制空格分隔。
xxd -p 是:连续十六进制字符流(无空格、无偏移),常用来喂别的工具。
本机同一段 32 字节:
# hexyl -p
7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
# xxd -p
7f454c46020101000000000000000000...
脚本互操作前看清是哪一个 -p。
坑 4:--panels 与 --terminal-width 互斥;负向 skip 写法 dual
error: the argument '--terminal-width <N>' cannot be used with '--panels <N>'
$ hexyl -s -16 -n 16 file
error: unexpected argument '-1' found
负偏移用 hexyl --skip=-16 … 或按提示加 --。跳过文件末尾会显示 No content 且 exit 0,自动化里建议再核对输出。
坑 5:二进制装到 ~/.local/bin 但 PATH 没带上
$ PATH=/usr/bin:/bin hexyl --version
hexyl: command not found
和 fd / bat 同一类:release 装法要自己保证 ~/.local/bin 在 PATH 里,或写绝对路径。
顺手好用的几个参数
hexyl file.bin # 默认双面板 + 字符区
hexyl -n 64 file.bin # 只看前 64 字节(可用 4KiB / 0xff)
hexyl -s 0x100 -n 32 file.bin # 跳过再看
hexyl --panels=4 file.bin # 多面板(终端要够宽)
hexyl -p file.bin # 素输出(不是 xxd -p)
hexyl --color=force file.bin # 无视 NO_COLOR,强制 ANSI
hexyl -v file.bin # 不挤相同行
printf '\x00\xff' | hexyl # 管道
小结
| 项 | 本机结果 |
|---|---|
| 版本 / 星数 | hexyl 0.17.0,约 1.03 万 星(2026-11-07) |
| 安装 | apt 无包 → GitHub release → ~/.local/bin |
| 默认布局 | 2 面板 / 16 字节行 + 分类字符区 + Unicode 框 |
| 8 MiB 转储 | never 102 ms;xxd 73 ms;od 696 ms(约 6.8×) |
| 1 MiB vs BusyBox hexdump -C | never 11.8 ms vs 345 ms(约 29×) |
| 着色 | 有 NO_COLOR 时 always 无效,要 --color=force |
| 坑 | apt;NO_COLOR;-p≠xxd -p;panels/width 互斥;负 skip;PATH |
一句话:hexyl 没有让「每行多少字节」发生革命(默认仍是 16),但它把右侧 ASCII 从「一排点」升级成可扫读的类别符号,并在大文件整页刷写时明显快过本机的 od 和 BusyBox hexdump -C;用之前先确认 NO_COLOR 和你要的到底是哪一种 -p。
完整测量日志在本机 hexyl/measurements.txt、large-*.json 与若干 out-*.txt;整理版以后会放到 Gumroad,先关注专栏「GitHub实测笔记」。
上一篇:hyperfine 本机实测(2.96MB 上 bat 开高亮中位 2.39s / cat 3.0ms)。
下一篇预告:bootandy/dust——更直观的 du,看目录体积树和本机相对 du -sh 差多少。有问题评论区见,看到都会回。