Oracle有用于编码的二进制值,特别是一个功能RAW
类型,成BASE64: BASE64_ENCODE
。这是有道理的。我想把二进制文件变成我可以更轻松地跨系统移植的东西。
但是,除了接受二进制RAW
作为其输入之外,它还RAW
为其输出返回一个二进制。我觉得这非常令人困惑,因为 base64 的目的是以文本格式对字节进行编码。
那么这个输出RAW
实际上包含什么?将其转换为实际文本类型(例如,VARCHAR2
)的正确方法是什么?
我还假设BASE64_DECODE
它的输入与 的输出格式相同BASE64_ENCODE
,但请注意,如果不是这种情况。
我专门使用 Oracle 11.2,但我怀疑自从它被引入以来这已经改变了。如果我错了,请随时纠正我的错误。
为了理解你的问题并模拟它,我生成了一种场景。首先我想介绍一下 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
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。
归档时间: |
|
查看次数: |
14936 次 |
最近记录: |