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

上一篇写完 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(文内单独说明)。


本机环境

text 复制代码
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 坑:

text 复制代码
$ sudo apt-get install -y hexyl
E: Unable to locate package hexyl

官方 README 写 Debian Buster+ 可以 apt-get install hexyl,本机 Debian 13 源里当天就是没有。改走官方 release:

bash 复制代码
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:

text 复制代码
┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
│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:

text 复制代码
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 默认列数一致。显式拉开:

bash 复制代码
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

可复现:

bash 复制代码
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 起也支持显式 -):

bash 复制代码
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。

对本机这段:

text 复制代码
│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)

text 复制代码
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 字节:

text 复制代码
# 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

text 复制代码
error: the argument '--terminal-width <N>' cannot be used with '--panels <N>'
text 复制代码
$ hexyl -s -16 -n 16 file
error: unexpected argument '-1' found

负偏移用 hexyl --skip=-16 ... 或按提示加 --。跳过文件末尾会显示 No content 且 exit 0,自动化里建议再核对输出。

坑 5:二进制装到 ~/.local/bin 但 PATH 没带上

text 复制代码
$ PATH=/usr/bin:/bin hexyl --version
hexyl: command not found

和 fd / bat 同一类:release 装法要自己保证 ~/.local/bin 在 PATH 里,或写绝对路径。


顺手好用的几个参数

bash 复制代码
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 差多少。有问题评论区见,看到都会回。

相关推荐
MoRay32 分钟前
放弃云端 Computer Use,我用 Python 手搓了一个带“物理防呆”的本地 GUI Agent 底座
python·github
用户2991422196801 小时前
GitHub 热榜项目:日榜(2026-11-07)
人工智能·开源·github
miofly4 小时前
GitHub 日榜趋势速报 | 2026-11-07
开源·github
miofly19 小时前
Inkling 2 Small 发布,基准测试大幅超越前代但不敌同级对手
开源·github
dong_junshuai20 小时前
每天一个开源项目#153 LZ4:用块边界和有序并行换取低延迟
github
Qiongkura20 小时前
开源自荐:CodeYear:把本机 Git 历史变成年度代码手账(本地优先 · 零上传 · 已上 PyPI)
github
用户83514140494921 小时前
我把 claude-mem 跑了一遍:值得学的地方和踩到的坑
github·claude
QuZhengRong21 小时前
【Luck‑Report】 AI 智能报表助手 + RAG 知识库 + 报表引擎 V2.0.9 更新
github·agent·报表·开源项目·数据可视化
一条Go1 天前
能力套餐:菜单、权限、开通范围怎么拆成三层而不打架
后端·github·saas