hexyl 本机实测:8MiB 转储中位 102ms、od 696ms(约 6.8×);默认双面板,NO_COLOR 下要 --color=force

5 阅读3分钟

上一篇写完 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.txt38 B文本 + Tab + UTF-8 中文
all_bytes.bin256 B0x00~0xff 各一字节
hexyl_elf.bin≈1.23 MiB本机 hexyl 可执行文件本身
1MiB.bin / 8MiB.bin1 / 8 MiB整文件转储吞吐
zeros_4k.bin4 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 -p5.5 ms
xxd8.0 ms
hexyl --color=never11.8 ms
hexyl --color=force(强制 ANSI)20.4 ms
od -Ax -tx1z85.3 ms
BusyBox hexdump -C344.7 ms(约 29× never)

8 MiB

命令中位数相对 hexyl never
hexyl -p50.8 ms≈0.5×
xxd72.5 ms≈0.7×
hexyl --color=never101.8 ms1×
hexyl --color=force171.1 ms≈1.7×
od -Ax -tx1z695.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 -p864
xxd1088
od -Ax -tx1z1207
BusyBox hexdump -C1273
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 -Cnever 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 差多少。有问题评论区见,看到都会回。