在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
相关产品推荐
相关产品推荐

