[20170308]bc做xor(異或)計算.txt

lfree發表於2017-03-08

[20170308]bc做xor(異或)計算.txt

--//工作需要,需要找一個計算器做異或操作.微軟的計算器太難用了.我需要行式的計算器.
--//google半天,發現如下連結:
http://unix.stackexchange.com/questions/292344/how-to-calculate-hexadecimal-xor-from-shell

--//找到如下連結:

--//簡直就是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部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2134945/,如需轉載,請註明出處,否則將追究法律責任。

相關文章