[20250407]GUID转换GUID_BASE64(补充2).txt

[20250407]GUID转换GUID_BASE64(补充2).txt

–//以前写过一篇GUID转换GUID_BASE64的文章,链接:[20200103]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。

来源链接:https://www.cnblogs.com/lfree/p/18815335

© 版权声明
THE END
支持一下吧
点赞8 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容