什么是 base64 RAW?我如何使用它?

jpm*_*c26 5 oracle

Oracle有用于编码的二进制值,特别是一个功能RAW类型,成BASE64: BASE64_ENCODE。这是有道理的。我想把二进制文件变成我可以更轻松地跨系统移植的东西。

但是,除了接受二进制RAW作为其输入之外,它还RAW为其输出返回一个二进制。我觉得这非常令人困惑,因为 base64 的目的是以文本格式对字节进行编码。

那么这个输出RAW实际上包含什么?将其转换为实际文本类型(例如,VARCHAR2)的正确方法是什么?

我还假设BASE64_DECODE它的输入与 的输出格式相同BASE64_ENCODE,但请注意,如果不是这种情况。

我专门使用 Oracle 11.2,但我怀疑自从它被引入以来这已经改变了。如果我错了,请随时纠正我的错误。

ato*_*pas 5

为了理解你的问题并模拟它,我生成了一种场景。首先我想介绍一下 Base64 的一般工作原理。
1) 它采用 ASCII 文本。
2)将其转换为十六进制值(十进制到十六进制转换)。
3) 以位(以字节为单位)表示文本。
4)由于Base64占用三个字节的数据。也就是说,它需要 24 位数据并返回 32 位编码字符。所以位应该表示为 6 位字符串。
5) 然后这6位字符串将被转换为十进制数。
6) 然后根据步骤4中计算出的十进制数选择ascii字符(AZ,az,0-1,+和/)。

现在我想实际展示这一点,还想展示 Oracle 的 Base64 编码如何返回 RAW 值。
假设我们要对文本'ABCD'进行编码。
1) 让我们将其转换为十六进制值的 RAW 数据。

SQL> SELECT UTL_RAW.CAST_TO_RAW('ABCD') FROM Dual;
41424344

我们得到了'ABCD'的十六进制值,即'41424344'
2) 让我们使用 Base64 对该十六进制进行编码。在Oracle中,我们有UTL_ENCODE包来对其进行编码,它接受RAW并返回RAW形式的编码值。

SQL> SELECT UTL_ENCODE.BASE64_ENCODE('41424344') FROM Dual;
51554A4452413D3D

让我解释一下我们如何根据上面提到的编码步骤获得这个值。
1)我们的文本是“ABCD”。
2) 十六进制表示为“41424344”。
3) 按字节分组的文本的二进制表示。

41->01000001 42->01000010 43->01000011 44​​->01000100

4) 按 6 位分组的文本的位表示。

010000 010100 001001 000011 010001 000000

(在输出文本中添加“=”符号,因为我们添加了 0 使其成为 6 位)
5) 文本的 6 位表示形式的十进制表示形式。

010000->16 010100->20 001001->9 000011->3 010001->17 000000->0

6)现在让我们根据十进制值从base64字符(AZ,az,0-9,+,/总共64个字符:0-63)中选择。

16->Q,20->U,9->J,3->D,17->R,0->A

输出:QUJDRA==
但 Oracle Base64 编码将此文本返回为 RAW(十六进制值)。为了将编码字符串作为文本而不是 RAW,我们可以将其转换为 VARCHAR2。

SQL>SELECT UTL_RAW.CAST_TO_VARCHAR2('51554A4452413D3D') FROM Dual;
奎德拉==

如果我们将这些文本的 ASCII 值转换为十六进制,我们就会得到 Base64 编码返回的编码字符串。

字符 ASCII 十六进制
问 81 51
U 85 55
J 74 4A
d 68 44
R 82 52
65 41
= 61 3D
= 61 3D

现在让我们将此文本转换为十六进制。

SQL>SELECT UTL_RAW.CAST_TO_RAW('QUJDRA==') FROM Dual;
51554A4452413D3D

我们得到原始编码字符串

51554A4452413D3D


现在为了将我的文本恢复为原始文本“ABCD”,让我们对其进行解码。

SQL>SELECT UTL_ENCODE.BASE64_DECODE('51554A4452413D3D') FROM Dual;
41424344
SQL>SELECT UTL_RAW.CAST_TO_VARCHAR2('41424344') FROM Dual;
A B C D

结论:因此,如果我们想要获取文本形式的编码值而不是十六进制,我们可以使用UTL_RAW.CAST_TO_VARCHAR2它简单地将十六进制转换为 varchar2。