十进制转成N进制
这里使用到:bc外部命令完成。bc命令格式转换为:
echo "obase=转成进制;十进值"|bc
echo "obase=2;31"|bc
echo "obase=16;31"|bc
N进制转十进制
((num=N#xxxxxxx));
把 N进制 的 xxxxxx 转化为十进制
((num=2#11111111));((num=16#FF));
echo $num;
应用实践
需求:把某天的第 N 个编号 ,记录为一个16进制的唯一编号。
具体规则:2018-9-20 的第1个编号 :2018-09-20 1
年份用4位二进制表示(2012为起始值0000)
月份用4位二进制表示
日子用5位二进制表示
当天的编号 N 用3位二进制表示
2018-9-20 第1个编号 用 (4+4+5+3 = 16) 位二进制 表示为:
2018-9-20-1
0110-1001-10100-001
把这16位二进制转化为4位十六进制数,这4位十六进制即为最终编码。
实现思路
整个原始编码为YYYY-MM-DD-NUM 共 4段 。把每段用bc 转化为二进制并按位数打印。
2018 -->0110 (4)
9 -->1001(4)
20 -->10100(5)
1 -->001(3)
把4段二进制数拼接成16位二进制
0110-1001-10100-001 --> 0110100110100001
把16位二进制转化为4位十六进制(二进制 --> 十进制 -->十六进制)
0110100110100001 -->27041 --> 69A1
脚本 mkver.sh
#!/bin/sh ##input data like: ./mkver.sh YYYY-MM-DD NUM DATE=$1 YEAR=$(echo $DATE|cut -d - -f 1) MOUTH=$(echo $DATE|cut -d - -f 2) DAY=$(echo $DATE|cut -d - -f 3) NUM=$2 if[[$DATE==''||$NUM=='']];then echo "usage: ./mkver.sh YYYY-MM-DD NUM" exit fi A=$(printf "%04d\n" `echo "obase=2;$YEAR-2012"|bc`) B=$(printf "%04d\n" `echo "obase=2;$MOUTH"|bc`) C=$(printf "%05d\n" `echo "obase=2;$DAY"|bc`) D=$(printf "%03d\n" `echo "obase=2;$NUM"|bc`) echo $YEAR"-"$MOUTH"-"$DAY"-"$NUM echo $A"-"$B"-"$C"-"$D E2=$A$B$C$D ((E10=2#$E2)); echo $E10 E16=$(echo "obase=16;$E10"|bc) echo $E16
执行结果
./mkver.sh 2018-9-20 1
2018-9-20-1
0110-1001-10100-001
27041
69A1
No Leanote account? Sign up now.