[20250407]GUID转换GUID_BASE64(增补2).txt
GUID转换GUID_BASE64(增补2).txt--//以前写过一篇GUID转换GUID_BASE64的文章,链接:GUID转换GUID_BASE64.txt
--//实际上linux直接有一个命令base64直接实现转换.先要转换raw类型再盘算,效果完全精确。
--//只不过21c做了小小改动,结尾增补00在做运算。
--//测试我以前写的bash shell脚本就存在一些问题。
1.环境:
SYS@book> @ver2
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 21.0.0.0.0
BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.测试:
SYS@book> select CON_ID,DBID,CON_UID,NAME,GUID,GUID_BASE64 from V$CONTAINERs;
CON_ID DBID CON_UID NAME GUID GUID_BASE64
------ ---------- ---------- -------- -------------------------------- ------------------------------
1 1617337831 1 CDB$ROOT C8209F27C6B16005E053362EE80AE60E yCCfJ8axYAXgUzYu6ArmDgA=
2 2763294012 2763294012 PDB$SEED 1F36DBBBA2C8169BE0636538A8C04D12 Hzbbu6LIFpvgY2U4qMBNEgA=
3 1073777561 1073777561 BOOK01P 1F36F47256D41C08E0636538A8C03260 Hzb0clbUHAjgY2U4qMAyYAA=
$ echo -n 1F36F47256D41C08E0636538A8C0326000|xxd -r -p | base64
Hzb0clbUHAjgY2U4qMAyYAA=
$ echo -n 1F36DBBBA2C8169BE0636538A8C04D1200|xxd -r -p | base64
Hzbbu6LIFpvgY2U4qMBNEgA=
$ echo -n C8209F27C6B16005E053362EE80AE60E00|xxd -r -p | base64
yCCfJ8axYAXgUzYu6ArmDgA=
--//完全能对上。注意结尾增补00.
--//这样21c的环境使用我当时写的测试脚本盘算就存在问题:
$ cat o64base.sh
#! /bin/bash
# convert guid to guid_base64
odebug=${ODEBUG:-0}
v2=${1}0
BASE64=($( echo {A..Z} {a..z} {0..9} + / ))
res=''
for i in $(echo "obase=64;ibase=16; $v2" | bc| tr -d '\\\r\n')
do
res=${res}${BASE64[$(( 10#$i ))]}
done
if [ $odebug -eq 1 ] ; then
echo v2=$v2 res=$res
fi
res=${res}==
echo $res
$ ./o64base.sh 1F36F47256D41C08E0636538A8C03260
Hzb0clbUHAjgY2U4qMAyYA==
--//盘算照旧只能增补1个0,但是结尾出现2个==。这样结尾给修改为A=才是精确的。
--//注:盘算照旧只能增补1个0,因为这样才气被6整除,(32+1)*4/6 = 22.
res=${res}==
--//要修改如下才是精确的。
res=${res}A=
--//很显着我写的脚本有问题,算法区别在于我写的脚本看成16进制盘算,而base64看成字符串。
--//21c的盘算结尾增补00 , 这样参数盘算的长度即是32+2=34.
--//34*4/6 取整 22,取模 34*4%6 = 4,这样要凑够64bits编码,就是增补2bits。而且结尾仅仅需要增补1个=。
--//而18c以前参数盘算的长度即是32.
--// 32*4/6 取整 21, 32*4%6 = 2,这样要凑够64bits编码(6bits),就是增补4bits,正好相当于增补1个0.而且结尾仅仅需要增补2个=。
--//改用乘法移位操作,增补2bits,相当于16进制的4.而增补4bits,相当于16进制的10.
$ cat o64basex.sh
#! /bin/bash
# convert guid to guid_base64
odebug=${ODEBUG:-0}
v2=${1}
v3=${2:-4}
BASE64=($( echo {A..Z} {a..z} {0..9} + / ))
res=''
for i in $(echo "obase=64;ibase=16; $v2 * $v3" | bc| tr -d '\\\r\n')
do
res=${res}${BASE64[$(( 10#$i ))]}
done
if [ $odebug -eq 1 ] ; then
echo v2=$v2 v3=$v3 res=$res
fi
#res=${res}==
echo $res
$ o64basex.sh 1F36F47256D41C08E0636538A8C0326000 4
Hzb0clbUHAjgY2U4qMAyYAA
--//前面23个字符完全对上。
--//注:我已经加了00,效果背面的pad = 我没有加上。背面的参数2为4实际上是16进制数字。
--//如果参数不添加2个00,可以写成如下,效果也是一样的。
$ ./o64basex.sh 1F36F47256D41C08E0636538A8C03260 4*10*10
Hzb0clbUHAjgY2U4qMAyYAA
$ ./o64basex.sh 1F36F47256D41C08E0636538A8C03260 "4*10*10"
Hzb0clbUHAjgY2U4qMAyYAA
--//背面10(16进制)表现前面参数1输入1个0.
--//再测试18c的环境:
SYS@192.168.x.y:1521/orclcdb> select banner from v$version;
BANNER
----------------------------------------------------------------------
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
SYS@192.168.x.y:1521/orclcdb> select CON_ID,DBID,CON_UID,NAME,GUID,GUID_BASE64 from V$CONTAINERs;
CON_ID DBID CON_UID NAME GUID GUID_BASE64
------ ---------- ---------- -------- -------------------------------- ------------------------
1 2756091850 1 CDB$ROOT 64A52F53A7683286E053CDA9E80AED76 ZKUvU6doMobgU82p6Artdg==
2 1474312904 1474312904 PDB$SEED 742DCFA2CE044FDEE0558253DD747177 dC3Pos4ET97gVYJT3XRxdw==
3 115310104 115310104 ORCL 74A69DC145F5662BE0558253DD747177 dKadwUX1ZivgVYJT3XRxdw==
$ echo -n 74A69DC145F5662BE0558253DD747177|xxd -r -p | base64
dKadwUX1ZivgVYJT3XRxdw==
--//不消增补00,盘算完成精确,分析背面的oracle版本做了小小改动,现在21c需要增补\0\0字符参与运算。
$ o64basex.sh 74A69DC145F5662BE0558253DD747177 10
dKadwUX1ZivgVYJT3XRxdw
--//前面22个字符完全对上。
--//注意参数2 10是16进制,相当于10进制的16。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]