在进行芯片调试时,我们可能会在各种设备上进行调试,有些设备不仅没有安装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
00000000000000000000000000101111
00000000000000000000000000101111
00000000000000001111111111111111