2013-12-18 36 views
0

我正在从数据库读取Oracle BLOB并希望将其转换为可读的字符串。 BLOB文本编码为二进制文件,我很确定它是用Base64编码的。Oracle BLOB(使用base 64编码)至字符串

我的阅读BLOB代码返回无法识别字符的字符串:

public String getStringFromBLOB(String sql) { 
    ... 
    resultSet.next(); 
    BLOB blob = null;   
    blob = ((OracleResultSet) resultSet).getBLOB(1); 

    byte[] bdata = blob.getBytes(1, (int) blob.length());  
    String tmpStr =new String(bdata); 
    str = new String(tmpStr.getBytes("UTF8"), "EUC_KR"); 
    return str; 
} 

任何帮助将非常感激。

+0

为什么要将结果字节[]转换为字符串?你确定它是一个字符串?还有UTF8?如果是这样,为什么将它存储为BLOB? – m0skit0

+2

如果你将它存储为一个blob,你为什么会打扰base-64编码呢?在我看来,你需要更仔细地调查真实情况。 –

+0

也许你的意思是'返回新的字符串(bdata,“EUC_KR”);'。 –

回答

0

如果您希望它是可读文本,则可以使用utl_encode软件包中提供的函数将其转换。

utl_encode.base64_decode() 

一些代码来源elsewhere使用它:

FUNCTION get_blob_from_base64_string (p_clob CLOB) 
RETURN BLOB 
IS 
l_chunk BLOB; --Chunks of decoded blob that'll be appended 
l_result BLOB; --Final blob result to be returned 
l_rawout RAW (32767); --Decoded raw data from first pass decode 
l_rawin RAW (32767); --Encoded raw data chunk 
l_amt NUMBER DEFAULT 7700; --Default length of data to decode 
l_offset NUMBER DEFAULT 1; --Default Offset of data to decode 
l_tempvarchar VARCHAR2 (32767); 
BEGIN 
BEGIN 
DBMS_LOB.createtemporary (l_result, FALSE, DBMS_LOB.CALL); 
DBMS_LOB.createtemporary (l_chunk, FALSE, DBMS_LOB.CALL); 
LOOP 
DBMS_LOB.READ (p_clob, l_amt, l_offset, l_tempvarchar); 
l_offset := l_amt + l_offset; 
l_rawin := UTL_RAW.cast_to_raw (l_tempvarchar); 
l_rawout := UTL_ENCODE.base64_decode (l_rawin); 
l_chunk := to_blob (l_rawout); 
DBMS_LOB.append (l_result, l_chunk); 
END LOOP; 
EXCEPTION 
WHEN NO_DATA_FOUND 
THEN 
NULL; 
END; 

来源是Oracle论坛上张贴的base64 解码CLOB(> 32K)

1

这应该做的。

byte[] bdata = blob.getBytes(0, (int) blob.length()); // From 0 
String data = new String(bdata, "US-ASCII"); // As it claimed to be Base64 
byte[] bytes = DatatypeConverter.parseBase64Binary(data); 
return new String(bytes, "EUC_KR"); // The original encoding before Base64 
+0

谢谢你的回应,但有两件事:首先我认为blob.getBytes应该从索引1开始,而不是0.其次,当试图运行它时,第三行抛出一个异常:“java.lang.ArrayIndexOutOfBoundsException :65533“。找不到原因。再次感谢 –

+0

你是对的,从1开始,至少w.r.t.我知道的界面Blob。这个异常可能表明parseBase64Binary和数据不是Base64。 –

相关问题