【发布时间】:2017-07-04 06:20:40
【问题描述】:
在 Oracle 中解码 Base64 字符串 (NVARCHAR2) 时,我试图获得与 Java 中相同的结果。
我确实有以下字符串:N'AAECAwQFBgdNu+qx2ZcqsA==',它基本上是打包成 Base64 编码的加密密码。
在 Java 中我正在这样做:
byte[] bytes = Base64.decodeBase64(testValue.getBytes());
for(byte b: bytes){
System.out.print(String.valueOf(b & 0xFF) + " "); //Decimal (unsigned)
}
for(byte b: bytes){
System.out.print(Integer.toHexString(b & 0xFF) + " "); //Hex
}
这会打印我以下内容:
Unsigned: 0 1 2 3 4 5 6 7 77 187 234 177 217 151 42 176
Hex: 0 1 2 3 4 5 6 7 4d bb ea b1 d9 97 2a b0
现在我想复制 Base64 解码,就像用 Java 制作的一样。我正在尝试关注 PL/SQL 函数:
base64DecodedInput:= UTL_ENCODE.base64_decode(UTL_I18N.STRING_TO_RAW(valueToDecrypt, charset));
DBMS_OUTPUT.PUT_LINE ( 'Base64 decoded is: ' || base64DecodedInput);
字符集是:AL16UTF16
valueToDecrypt 是我上面提到的测试字符串NVARCHAR2(200)
DBMS_OUTPUT 打印我:
Base64 decoded is: 0000004200300105A8308FDD02FE02B11B7901EA02C0
这是错的!...
我错过了什么。 PL/SQL 是否没有使用 url 安全解码之类的?
我被卡住了。
代码是 PL/SQL 函数的一部分:
CREATE OR REPLACE FUNCTION decodeBase64
(valueToDecrypt IN NVARCHAR2)
RETURN NVARCHAR2
AS
--Declaration area
charset VARCHAR(100);
base64DecodedInput RAW(2000);
...
而服务器/数据库设置是:
NLS_RDBMS_VERSION 12.1.0.2.0
NLS_NCHAR_CONV_EXCP FALSE
NLS_LENGTH_SEMANTICS BYTE
NLS_COMP BINARY
NLS_DUAL_CURRENCY $
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_SORT BINARY
NLS_DATE_LANGUAGE AMERICAN
NLS_DATE_FORMAT DD-MON-RR
NLS_CALENDAR GREGORIAN
NLS_NUMERIC_CHARACTERS .,
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET WE8MSWIN1252
NLS_ISO_CURRENCY AMERICA
NLS_CURRENCY $
NLS_TERRITORY AMERICA
NLS_LANGUAGE AMERICAN
【问题讨论】: