linux shell 不同进制转换解析与示例
? shell ?    2019-01-11 16:22:44    910    0    0
gua_l   ? shell ?

十进制转成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

Pre: GitLab GEO 异地主副服务器同步--文档翻译

Next: mount/nfs 共享目录

910
Sign in to leave a comment.
No Leanote account? Sign up now.
0 comments
Table of content