在Oracle和Java中使用Base64

Oracle

UTL_RAW:处理二进制的数据包。

UTL_ENCODE:处理编码包。

  • UTL_ENCODE.BASE64_ENCODE使用

    步骤:

    1. 先用UTL_RAW.CAST_TO_RAW把varchar2转换为raw类型.
    2. 使用UTL_ENCODE.BASE64_ENCODE编码.
    3. 使用UTL_RAW.CAST_TO_VARCHAR2从raw(二进制类型)转换为varchar2类型转换.

      注意: raw类型也可以进行传递,但是Java中要使用Byte进行解析。

    1
    2
    select utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('{"count": 1000}')))
    from dual;
  • UTL_ENCODE.BASE64_DECODE使用

    1
    select utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw('e1wiY291bnRcIjogMTAwMH0='))) from dual;
  • 指定字符编码

    1
    2
    UTL_ENCODE.TEXT_ENCODE(string, charset);
    UTL_ENCODE.TEXT_DECODE(string, charset);

Java

BASE64Decoder

BASE64Encoder

EncodeUtil:工具类

  • BASE64Encoder使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static String encodeString(String plainText, String charSet)
    {
    BASE64Encoder encoder = new BASE64Encoder();
    try
    {
    return encoder.encode(plainText.getBytes(charSet));
    }
    catch(UnsupportedEncodingException e)
    {
    throw new EncodeException("E0208.0013", EcpI18nUtil.localizedString("E0208.0013", "\u4E0D\u652F\u6301\u7684\u5B57\u7B26\u96C6"), e, new Object[0]);
    }
    }
  • BASE64Decoder使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static String decodeString(String encodedText, String charSet)
    {
    BASE64Decoder decoder = new BASE64Decoder();
    try
    {
    return new String(decoder.decodeBuffer(encodedText), charSet);
    }
    catch(Exception e)
    {
    throw new EncodeException("E0208.0013", EcpI18nUtil.localizedString("E0208.0013", "\u89E3\u7801\u5931\u8D25"), e, new Object[0]);
    }
    }
  • Java中byte和String相互转换

    1
    2
    3
    4
    5
    6
    // String -> byte
    String str = "count";
    byte[] bytes = str.getBytes("GBK");

    // byte -> String
    String str2 = new String(bytes, 'GBK');
  • 字符集

    编码和解码都可以指定字符集。如果字符串中有中文 编码之后解码会出现乱码,因为Ecp工具类默认使用GBK字符集编码解码

  • 注意

    如果希望服务端Java编码之后可以在数据库过程中进行解码(反之亦然),请不要在关键业务数据中出现中文