Linux: 使用最基础命令实现16进制转2进制

文摘   2025-01-03 21:44   北京  

在进行芯片调试时,我们可能会在各种设备上进行调试,有些设备不仅没有安装python甚至连稍微高级的shell命令都没有安装,并且设备无法联网,此时就需要使用最基础的shell命令实现一些功能。

方法1:采用bc命令可以将16进制转换成2进制

[icxiaoge@asic ~]cat hex2bin.sh value="2F"bc <<< "ibase=16;obase=2; $value "[icxiaoge@asic ~][icxiaoge@asic ~]./hex2bin.sh 101111[icxiaoge@asic ~]

<<< 操作符,它表示 “此处字符串”,后面跟着的双引号内的字符串 "ibase=16;obase=2; 1B" 就相当于直接作为输入传递给了 bc 命令,bc 接收到这个输入后,会按照 ibase=16(设置输入为十六进制)、obase=2(设置输出为二进制)的规则对十六进制数 1B 进行转换并输出对应的二进制结果 11011

NOTE: bc无法识别小写字母a~f如果输入数据存在小写a~f,则会出现语法报错。

[icxiaoge@asic ~]echo 'ibase=16;obase=2; 2f'|bc(standard_in) 1: syntax error

案例2:采用for循环实现16进制转2进制

此案例中,并且采用for循环将每个16进制的字符转成成二进制的4比特数据,并且将数据拼接起来,其中考虑了小写字符a~f,最后将不足32bit的数据不足到32bit。

[root@icxiaoge pcie_tool]# cat ./cmn_hex_2_bin_32.sh #!/bin/bash # 定义函数 hex_to_bin_32,将十六进制转换为32位二进制字符串cmn_hex_to_bin_32() {    local hex_data="$1"    # 初始化一个空字符串用于存储二进制数据    local bin_data=""     # 循环处理每个十六进制字符    for (( i=0; i<${#hex_data}; i++ )); do        # 提取单个十六进制字符        local char="${hex_data:$i:1}"        # 将十六进制字符转换为4位二进制字符串        case "$char" in            0) bin_part="0000" ;;            1) bin_part="0001" ;;            2) bin_part="0010" ;;            3) bin_part="0011" ;;            4) bin_part="0100" ;;            5) bin_part="0101" ;;            6) bin_part="0110" ;;            7) bin_part="0111" ;;            8) bin_part="1000" ;;            9) bin_part="1001" ;;            A) bin_part="1010" ;;            a) bin_part="1010" ;;            B) bin_part="1011" ;;            b) bin_part="1011" ;;            C) bin_part="1100" ;;            c) bin_part="1100" ;;            D) bin_part="1101" ;;            d) bin_part="1101" ;;            E) bin_part="1110" ;;            e) bin_part="1110" ;;            F) bin_part="1111" ;;            f) bin_part="1111" ;;            *) echo "Invalid hex digit: $char"return 1 ;;        esac        # 将4位二进制字符串追加到bin_data        bin_data+="$bin_part"    done     # 如果二进制数据不足32位,则在前面补零    if [ ${#bin_data} -lt 32 ]; then        bin_data=$(printf "%32s" "$bin_data" | tr ' ' '0')    fi     # 输出32位二进制数据    echo "$bin_data"} cmn_hex_to_bin_32 "2f"cmn_hex_to_bin_32 "2F"cmn_hex_to_bin_32 "ffff"

函数调用命令

cmn_hex_to_bin_32 "2f"

cmn_hex_to_bin_32 "2F"

cmn_hex_to_bin_32 "ffff"

产生了如下输出:

可以看到不足32bit的高位已填充0

[root@yunsilicon pcie_tool]# ./cmn_hex_2_bin_32.sh 000000000000000000000000001011110000000000000000000000000010111100000000000000001111111111111111

处芯积律
处芯积律,而后知所至。一个芯片人的技术和行业研究分享。
 最新文章