Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2372327
  • 博文数量: 473
  • 博客积分: 12252
  • 博客等级: 上将
  • 技术积分: 4307
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-12 10:02
文章分类

全部博文(473)

文章存档

2012年(8)

2011年(63)

2010年(73)

2009年(231)

2008年(98)

分类:

2009-04-02 17:45:48


寂寞烈火
[原创?]shell版十进制转二进制脚本

[code]
#!/bin/bash
#
Usage(){
        echo "Error!!!"
        exit 1
}
num=$1
m=0
while ((m<${#num}));do
        [[ ${num:$m:1} = [0-9] ]] || Usage
        ((m++))
done
[[ $# -ne 1 || $1 == 0* ]] && Usage
bin=$(
while ((num!=0));do
        b=$((num%2))
        echo -n $b
        num=$((num/2))
done
)
echo -n $1\'s BinCode is:
n=${#bin}
while ((n>=0));do
        echo -n ${bin:$n:1}
        ((n--))
done
echo
echo Convert Finish![/code]
请大家测试

2008-4-2 00:04 Shell_HAT
works fine from my side:

$ ./a.sh 10
10's BinCode is:1010
Convert Finish!

2008-4-2 00:30 網中人
echo "obase=2;10" | bc

2008-4-2 00:45 sieur
楼主,我正在写一个处理IP的脚本,其中一个处理十进制转二进制的函数,还没修改,顺便测试:
89 function dec2bin() {
90     local -r ip="$1"
91     local sec2=
92     local pos=
93     ip2=
94
95     for sec in `echo $ip | awk -F'.' '{print $1, $2, $3, $4}'`; do
96         sec2='00000000'
97         pos=7
98         while (( sec/2 )); do
99             (( sec%2 )) && {
100                 sec2=`echo $sec2 | sed -e 's@\(.\{'$pos'\}\).\(.*\)@\11\2@'`
101             }
102             (( --pos ))
103             (( sec /= 2 ))
104         done
105         [ $sec ] && sec2=`echo $sec2 | sed -e 's@\(.\{'$pos'\}\).\(.*\)@\11\2@'`
106         ip2=`echo $ip2 | sed -e 's@$@.'$sec2'@'`
107     done
108     ip2=`echo $ip2 | sed -e 's@^.@@'`
109 }

2008-4-2 10:52 xinyv
网老大又出来砟人了,不过烈火写的纯 bash 脚本还是很强的。
学习了。

2008-4-2 11:04 FinalBSD
[quote]原帖由 [i]網中人[/i] 于 2008-4-2 00:30 发表 [url=][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
echo "obase=2;10" | bc [/quote]
我也想说这个。:em21: :em21: :em21: 简单才是美嘛

2008-4-2 11:17 xinyv
烈火那个是纯bash的,你没安装bc咋办?
[code]
#!/bin/sh
[ -z $1 ] && { echo "Error!!!";exit 1; }
function Usage(){
  for ((i=${#_M[@]};i>0;i--));do
     echo -n ${_M[$i]}
  done
  echo ${_M[0]}
  exit 0
}
_T=$1;_N=0
function expr2(){
  [ ${_T} -lt 2 ] && { _M[${_N}]=${_T};Usage; }
  _M[${_N}]=$((${_T}%2));((_N++))
  _T=$((${_T}/2))
  expr2 ${_T}
}
expr2 ${_T}
[/code]
起起哄刚学习,写了一个。

2008-4-2 16:54 zhengwei_zw
请楼主解释下算法那些吧。我等菜鸟看不明白啊

2008-4-2 22:58 Shell_HAT
[quote]原帖由 [i]網中人[/i] 于 2008-4-2 00:30 发表 [url=][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
echo "obase=2;10" | bc [/quote]

$ echo "obase=2;10" | bc
bash: bc: command not found

明天到公司找台 Unix server 试试

2008-4-2 23:56 寂寞烈火
[quote]原帖由 [i]zhengwei_zw[/i] 于 2008-4-2 16:54 发表 [url=][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
请楼主解释下算法那些吧。我等菜鸟看不明白啊 [/quote]
十进制转二进制的算法很简单
用2相除至结果为1 , 将余数和最后的1从下向上倒序写 就是结果
网上有的是各种转换的方法

2008-4-10 08:03 7717060
我也来支持一下

2008-10-16 20:09 prc
[code]
#/bin/bash

array=( 0000 0001 0010 0011
0100 0101 0110 0111
1000 1001 1010 1011
1100 1101 1110 1111)

function _oct2bin()
{
        echo -n ${array["0x$1"]}
}
function oct2bin()
{
        local str i len
        str=$(printf "%x" $1)
        len=${#str}
       
        for((i=0;i         {
                _oct2bin ${str:$i:1}
        }
}
oct2bin $1
[/code]

2008-10-16 21:06 lseeo
回复 #12 prc 的帖子

很酷.
printf "%x" $1 是转换成16进制吗? 没有直接转成2进制的表示吗?

最好再加上参数判断~

2008-10-17 09:59 prc
[quote]原帖由 [i]lseeo[/i] 于 2008-10-16 21:06 发表 [url=][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
很酷.
printf "%x" $1 是转换成16进制吗? 没有直接转成2进制的表示吗?

最好再加上参数判断~ [/quote]
printf不支持二进制输出,只支持八进制和十六进制

阅读(1538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~