日期:2014-05-20  浏览次数:20712 次

byte[]数组与String转换
byte[]数组与String转换有没有可能丢失数据???(涉及DES加解密)

比如要传送字符串A:把A.getBytes()加密后传出
接收方接收到后,先解密得到byte[],然后再把这个数组转换成String B
按理说得到的B应该跟A一样吧?

可是我碰到的是基本上一样,但偶尔会不一样
谁知道是什么原因啊


转换方法如下:String s1 = "hello";
  byte[] b = s.getBytes();
  String s2 = new String(b);
(我自己在网上搜到的好像是说涉及加解密的时候,用上述方法转换byte数组和String有可能丢失数据)
如果真的是会丢失数据,那该怎样保证不会丢失??

------解决方案--------------------
先说说加密解密思路: 任意一个字符串,都是由若干字节表示的,每个字节实质就是一个8位的二进制数, 又因为 一个8位二进制数,可用两位16进制字符串表示. 因此 任意一个字符串可以由两位16进制字符串表示。 而 DES是对8位二进制数进行加密,解密。 所以用DES加密解密时,可以把加密所得的8位进进制数,转成两位16进制数进行保存,传输。 
具体方法:
1 把一个字符串转成8位二进制数,用DES加密,得到8位二进制数的密文 
2 然后把(由1)所得的密文转成两位十六进制字符串 
3 解密时,把(由2)所得的两位十六进制字符串,转换成8位二进制数的密文 
4 把(由3)所得的密文,用DES进行解密,得到8位二进制数形式的明文, 并强制转换成字符串。 
思考:为什么要通过两位16进制数字符串保存密文呢? 
原因是:一个字符串加密后所得的8位二进制数,通常不再时字符串了,如果直接把这种密文所得的8位二进制数强制转成字符串,有许多信息因为异常
而丢失,导制解密失败。因此要把这个8位二制数,直接以数的形式保存下来,而通常是用两位十六进制数表示。

希望对你有帮助,给分吧,哈哈 

------解决方案--------------------
根据DES加密解密算法的原理和步骤,是把数据以2进制数表示,按位来操作的,整个算法全部都是位操作,S盒、P盒、左右部分异或等,一个字符串,全部被打乱,解密时,再逆向操作,一般不会丢失数据的,这是需要验证的,你可以做几次实验试试,我没遇到过转换byte数组和String丢失数据的情况,如果你担心,那你就手动操作转换。
------解决方案--------------------
引用楼主 SARA520 的帖子:
byte[]数组与String转换有没有可能丢失数据???(涉及DES加解密)

比如要传送字符串A:把A.getBytes()加密后传出
接收方接收到后,先解密得到byte[],然后再把这个数组转换成String B
按理说得到的B应该跟A一样吧?

可是我碰到的是基本上一样,但偶尔会不一样
谁知道是什么原因啊
(我自己在网上搜到的好像是说涉及加解密的时候,用上述方法转换byte数组和String有可能丢失数据)
如果真的是会丢失数据,那该怎样保证不会丢失??

------解决方案--------------------
涉及到平台编码问题,byte转成char没问题, char转成byte可能产生截断,也可能数据丢失!注意!
------解决方案--------------------
String s1 = "hello"; 
byte[] b = s.getBytes(); 
String s2 = new String(b); 
这个倒是常用,至于会不会丢失数据,有这个可能,可以忽略
------解决方案--------------------
不会丢失数据,但是如果转换时字符集不一样则会出现转换出的数值不一致
------解决方案--------------------
4楼说的很正确啊
byte[] b = s.getBytes("UTF-8");
String s2 = new String(b,"UTF-8");
上面的UTF-8只是作个例子,转化为字节流和字符时最好能自己指定编码