linux sh进制转换,linux 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值