[20170308]bc做xor(异或)计算.txt
--//工作需要,需要找一个计算器做异或操作.微软的计算器太难用了.我需要行式的计算器.
--//google半天,发现如下链接:
http://unix.stackexchange.com/questions/292344/how-to-calculate-hexadecimal-xor-from-shell
--//找到如下链接:
http://phodd.net/gnu-bc/index.html
--//简直就是bc的宝库.不过我仅仅需要logic.bc,例子:
$ echo 'obase=16;ibase=16; xor(AA,FF)' | bc -l ~/bc/logic.bc
55
--//我昨天计算如下数值的xor,结果如下:
9cb5
0400
0100
0200
0100
0000
0100
----
9bb5
$ cat xor.sh
#! /bin/bash
# just play , calc xor!!
s='0'
for i in $(cat $1| tr 'a-f' 'A-F')
do
#echo "obase=16;ibase=16; xor($s,$i)"
echo $i
s=$(echo "obase=16;ibase=16; xor($s,$i)" | bc -l ~/bc/logic.bc)
done
echo -e "\nxor result: $s \n"
$ cat a.txt
9cb5
0400
0100
0200
0100
0000
0100
--//执行如下:
$ xor.sh a.txt
9CB5
0400
0100
0200
0100
0000
0100
xor result: 9BB5
--OK,结果正确!!
--//再找一个redo文件头做验证看看.
$ xxd -seek 512 -l 512 -c 16 -g 2 /mnt/ramdisk/book/redo01.log | cut -c10-50 > aa1.txt
$ xor.sh aa1.txt
...
xor result: 0
--//说明结果正确.这种脚本不讲究运算效率,不断调用bc效率不会很高,而是讲究快速编程.最后修改如下,'0000'不参与运算.
$ cat ~/bin/xor.sh
#! /bin/bash
# just play , calc xor!!
s='0'
for i in $(cat $1| tr 'a-f' 'A-F')
do
#echo "obase=16;ibase=16; xor($s,$i)"
echo $i
[ $i != '0000' ] && s=$(echo "obase=16;ibase=16; xor($s,$i)" | bc -l ~/bc/logic.bc)
done
echo -e "\nxor result: $s \n"
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2134945/ ,如需转载,请注明出处,否则将追究法律责任。