/******************************************************************************************
* 版权声明
* 本文为本人原创,本人拥有此文的版权。鉴于本人持续受益于开源软件社区,
* 本人声明:任何个人及团体均可不受限制的转载和复制本文,无论是否用于盈利
* 之目的,但不得修改文章内容,并必须在转载及复制时同时保留本版权声明,否
* 则为侵权行为,本人保留追究相应主体法律责任之权利。
* speng2005@gmail.com
* 2015-11
******************************************************************************************/
纯shell程序实现base64编码,使用常规的加减乘除算法实现。有兴趣的也可以使用类似let "ret=mask&byte"语句直接使用位运算来改造此算法。
base64_encode_string()
{
source_string=$1
if [ 0 -eq ${#source_string} ]; then
return
fi
BASE64_CODE_TABLE=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + /)
# first base64 byte's bit-mask from source byte is [byte No 1]11111100
# second base64 byte's bit-mask from source byte is [byte No 1]00000011 and [byte No 2]11110000
# third base64 byte's bit-mask from source byte is [byte No 2]00001111 and [byte No 3]11000000
# fourth base64 byte's bit-mask from source byte is [byte No 3]00111111
FIRST_SOURCE_BYTE_DIVIDEND=0x04
SECOND_SOURCE_BYTE_DIVIDEND=0x10
THIRD_SOURCE_BYTE_DIVIDEND=0x40
#encode_state can be: 1, 2, or 3, which indicate the encoding-process order in soure string
encode_state=1
last_source_byte=""
result=""
for (( i = 0; i < ${#source_string}; ++i ))
{
curChar=`printf "%d" "'${source_string:i:1}";`
#echo curChar=$curChar
case $encode_state in
1)
index=$(( $curChar / $FIRST_SOURCE_BYTE_DIVIDEND ))
#echo "index in state 1 is: $index"
result="$result${BASE64_CODE_TABLE[$index]}"
encode_state=2;;
2)
index_high=$(( ($last_source_byte % $FIRST_SOURCE_BYTE_DIVIDEND) * 0x10 ))
index_low=$(( $curChar / $SECOND_SOURCE_BYTE_DIVIDEND ))
index=$(( $index_high + $index_low ))
#echo "index in state 2 is: $index"
result="$result${BASE64_CODE_TABLE[$index]}"
encode_state=3;;
3)
index_high=$(( ($last_source_byte % $SECOND_SOURCE_BYTE_DIVIDEND) * 0x04 ))
index_low=$(( $curChar / $THIRD_SOURCE_BYTE_DIVIDEND ))
index=$(( $index_high + $index_low ))
#echo "index1 in state 3 is: $index"
result="$result${BASE64_CODE_TABLE[$index]}"
index=$(( $curChar % $THIRD_SOURCE_BYTE_DIVIDEND ))
#echo "index2 in state 3 is: $index"
result="$result${BASE64_CODE_TABLE[$index]}"
encode_state=1;;
esac
last_source_byte=$curChar
}
# process pading
case $encode_state in
2)
index=$(( ($last_source_byte % $FIRST_SOURCE_BYTE_DIVIDEND) * 0x10 ))
#echo "index in pading state 2 is: $index"
result="$result${BASE64_CODE_TABLE[$index]}==";;
3)
index=$(( ($last_source_byte % $SECOND_SOURCE_BYTE_DIVIDEND) * 0x04 ))
#echo "index in pading state 3 is: $index"
result="$result${BASE64_CODE_TABLE[$index]}=";;
esac
echo $result
}