2013-12-17 47 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

雅仍然有同样的问题,我已经发布了我以前测试过的代码。 –