2013-12-17 50 views
1

我正在一個項目中,我必須從PHP服務器解密一個xml文本並解析成java,我已經使用CipherInputStream解密了xml文本,並看到xml文件完全打印,但我面臨的一個奇怪的問題,而試圖存儲在一個java字符串中的XML文本,我工作的代碼如下:問題與java字符串和字符串生成器

public String decrypt(InputStream Fis){ 

Cipher c = Cipher.getInstance(algo + "/CBC/NoPadding"); 

String add = ""; 

StringBuilder getAns = new StringBuilder(); 

c.init(Cipher.DECRYPT_MODE, key); 

CipherInputStream cis = new CipherInputStream(Fis , c); 

byte[] encData = new byte[16]; 

int dummy; 

while ((dummy = cis.read(encData)) != -1) 
     { 

      System.out.println(new String(encData, "UTF-8").trim()); 

        add = (new String(encData, "UTF-8").trim()); 

        getAns.append(add); 


} 

System.out.println(getAns); 
... 
} 

它通過第一的println打印日誌貓完整的XML文本while循環內的語句,但是當打印StringBuilder getAns時,它只打印一部分文本。

我也試着只用字符串:

add = add + (new String(encData, "UTF-8").trim()); 

也使用ArrayList<String>但它只能打印文本的一部分。

我想這可能是由於一個愚蠢的錯誤,但我正在努力與此。任何幫助將不勝感激。

+1

如果您發佈預期的和實際的輸出,特別是'getAns'輸入停止處的文本,這將會很有幫助。請注意,'add'的內容不包含換行符,它由'println'附加。 – chrylis

+0

@chrylis但抱歉,我無法發佈這些代碼,這就是爲什麼我正在加密和解密文本。 –

+1

您是否嘗試刪除打印語句並查看StringBuilder是否工作?嘗試調試並查看添加String的內容。 – dARKpRINCE

回答

1

終於發現問題了,它與System.out.pritnln()對打印有一定的限制。此功能一次只能打印約4060個字符,我通過使用getAns.substring(10000,15000);發現了此功能。

+0

@laalto但是,在我的情況下,它一次打印大約4060個字符。那麼它可能會爲我提供4個更多的kB作爲寬限字節?請你直接到那個你有這個信息的信息頁面? –

+0

使用'adb logcat -g'來獲取logcat參數。例如。對於我的主設備,有效載荷最大值爲4076字節。 – laalto

2

您正在閱讀從while條件內部的輸入流一些字節:

while ((dummy = cis.read(encData)) != -1) 

這已經填充encData字節數組與具有在dummy可變的讀出的字節數正確。之後再讀取一些字節:

dummy = cis.read(encData); 

這將覆蓋您之前讀取的一個字節的字節。刪除該行!

+0

哎呀,對不起,我發貼時粘貼了,我編輯了我的帖子。 –

+0

這是否意味着,你仍然有問題與現在編輯的代碼?這是否也意味着,你沒有測試你發佈的代碼?那麼我必須要求你先寫一個簡單而且正在運行的程序,最小化你正面臨的問題。也許有一些測試數據,我們可以使用。 – Seelenvirtuose

+0

雅仍然有同樣的問題,我已經發布了我以前測試過的代碼。 –