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

如何用Bash将多行多值十六进制批量转换为十进制?

处理多格式十六进制转十进制的Bash实现

针对两种目标文件格式(多逗号分隔十六进制行、带标识前缀的十六进制行),下面提供两种高效实现,既能完成十六进制到十进制的转换,又能完整保留原有的逗号分隔、行结构及标识前缀:

推荐方案:用awk一次性处理

awk在处理文本字段和行结构上天生具备优势,代码简洁且效率更高:

awk -F: '
{
    if (NF > 1) {
        printf "%s:", $1
        hex_part = $2
    } else {
        hex_part = $0
    }
    split(hex_part, hex_vals, /,/)
    for (i=1; i<=length(hex_vals); i++) {
        printf "%d", strtonum("0x" hex_vals[i])
        if (i < length(hex_vals)) printf ","
    }
    print ""
}' input.txt

逻辑说明

  • 以冒号:为分隔符识别前缀行,先输出前缀(如X:)再处理后续十六进制内容
  • 纯逗号分隔行直接拆分所有十六进制值,逐个转换为十进制
  • strtonum("0x" hex_vals[i])自动解析十六进制字符串为十进制数,确保单字节值范围(0-255)
  • 严格保留原行的逗号分隔格式和换行结构

兼容原有printf逻辑的方案

如果偏好基于原有的printf循环实现,可结合Bash的字符串处理完成:

while IFS= read -r line; do
    # 提取并保留前缀(若存在)
    prefix=""
    [[ "$line" == *:* ]] && { prefix="${line%%:*}:"; line="${line#*:}"; }
    # 将逗号替换为空格,利用printf批量转换
    dec_str=$(printf "%d," $((16#$line)) | sed 's/,$//')
    # 拼接前缀与转换结果输出
    echo "${prefix}${dec_str}"
done < input.txt

测试示例

输入文件内容:

a1,0f,3c
X:10,ff,00
b2,7d
Y:0a,1b

执行脚本后输出:

161,15,60
X:16,255,0
178,125
Y:10,27

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:42:46