You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Bash中使用/dev/urandom生成指定长度随机十六进制数的问题

生成指定长度随机十六进制数的问题与修复

一、输出字符数是指定长度两倍的原因与修复

原因

/dev/urandom输出的是二进制字节流,每个二进制字节转换为十六进制需要2个字符(例如字节0x1f会被转为1F)。你用head -c $length获取了$length个二进制字节,经xxd转码后自然会得到2*$length个十六进制字符。

修复命令

根据需求分两种情况:

  • 若只需要偶数长度的十六进制串:
head -c $((length/2)) /dev/urandom | xxd -p -u | tr -d '[:space:]'
  • 若需要支持奇数长度的十六进制串(比如length=1时输出1个字符):
head -c $(( (length + 1) / 2 )) /dev/urandom | xxd -p -u | tr -d '[:space:]' | head -c $length

说明:

  • $(( (length + 1) / 2 )):对奇数长度向上取整,确保能生成足够的十六进制字符,再用head -c $length截取到目标长度
  • 移除了xxd的-c $length参数,因为在plain模式下它不影响总字符数
  • 去掉tr中的\\,xxd默认不会输出反斜杠,无需过滤

二、xxd的-c参数为何不影响最终输出

当使用xxd -p(plain纯文本输出模式)时,-c参数仅控制每行输出的十六进制字符数(即换行位置),不会改变转换后的总字符数。

比如你取4个二进制字节,转成十六进制固定是8个字符:

  • -c 4会分成两行输出(每行4个字符)
  • -c 20000会在一行输出所有8个字符
    但经过tr -d '[:space:]'去掉换行符后,最终结果都是8个字符,所以看起来-c参数没起作用。

内容的提问来源于stack exchange,提问作者chyxo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:05:23