gpt4 book ai didi

java - 在 PL/SQL 中复制 Java 的 Base64 解码

转载 作者:行者123 更新时间:2023-11-30 02:28:33 27 4
gpt4 key购买 nike

我试图获得与在 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

现在我想像在 Java 中那样复制 Base64 解码。我正在尝试在 PL/SQL 函数中执行以下操作:

base64DecodedInput:= UTL_ENCODE.base64_decode(UTL_I18N.STRING_TO_RAW(valueToDecrypt, charset));
DBMS_OUTPUT.PUT_LINE ( 'Base64 decoded is: ' || base64DecodedInput);

字符集是:AL16UTF16valueToDecrypt 是我上面提到的测试字符串 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

最佳答案

看看CAST_TO_RAW D文档:

This function converts a VARCHAR2 value represented using some number of data bytes into a RAW value with that number of data bytes.

你应该使用这个:

base64DecodedInput:= UTL_ENCODE.base64_decode(UTL_RAW.CAST_TO_RAW(TO_CHAR(valueToDecrypt)));
DBMS_OUTPUT.PUT_LINE ( 'Base64 decoded is: ' || base64DecodedInput);

00010203040506074DBBEAB1D9972AB0

哪个(格式化)应该等于期望的结果:

00 01 02 03 04 05 06 07 4D BB EA B1 D9 97 2A B0

对于 BASE64 字符串使用 NVARCHAR2 是毫无用处的。 BASE64 编码的主要目的是仅用 ASCII 字符表示任意数据,因此 NVARCHAR2 没有任何意义。由于 BASE64 仅包含 ASCII,因此您不必担心 CAST(... AS VARCHAR2(200)) 中的任何字符编码。

当然,对于解码字符串数据类型NVARCHAR2可能非常有用。

关于java - 在 PL/SQL 中复制 Java 的 Base64 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44898285/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com