2013-12-18 35 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。 –

相關問題