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有可能丢失数据)
如果真的是会丢失数据,那该怎样保证不会丢失??

解决方案 »

  1.   

    先说说加密解密思路: 任意一个字符串,都是由若干字节表示的,每个字节实质就是一个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位二制数,直接以数的形式保存下来,而通常是用两位十六进制数表示。希望对你有帮助,给分吧,哈哈 
      

  2.   

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

  3.   

    答:
    1)网上答案有正确的,也有很多不正确的.
    2)转换方法如下:
                  String s1 = "hello"; 
                byte[] b = s.getBytes();//你这是按默认平台编码方案转成字节数组的 
                //将该字节数组加密,通过字节流网络传输.
                //对方完整地收到.
                //解密还原
                String s2 = new String(b); //按默认平台编码方案转成字节数组的理论上:楼主的方案是没有任何问题的.你的担心是不存在的.
    若有丢失:则可能的地方有:
    1)发与收的双方的默认平台编码不一致.(如:WIN下是GBK,而LINUX下是UTF-8,这样当然会出问题)
    2)网络发送与接收时,程序代码写得不好,字节数据没有确保完整地接收到
    3)加解密算法有问题.即:对于一些很特殊的数据,加密后的数据,在解密还原时不能完整地还原了.以上仅供楼主参考
      

  4.   

    涉及到平台编码问题,byte转成char没问题, char转成byte可能产生截断,也可能数据丢失!注意!
      

  5.   

    String s1 = "hello"; 
                byte[] b = s.getBytes(); 
                String s2 = new String(b); 
    这个倒是常用,至于会不会丢失数据,有这个可能,可以忽略
      

  6.   

    4楼说的很正确啊
    byte[] b = s.getBytes("UTF-8");
    String s2 = new String(b,"UTF-8");
    上面的UTF-8只是作个例子,转化为字节流和字符时最好能自己指定编码
      

  7.   

    请问兄弟解决了没?我也遇到了同样的问题,在做加密和解密的时候,用
                 String s1 = "hello"; 
                byte[] b = s.getBytes(); 
                String s2 = new String(b); 
    来转换是绝对不行的,希望能解决。目前我是直接将加密的结果用byte[]来保存,然后在传给解密方法byte[]型参数。
      

  8.   

    http://blog.chinaunix.net/uid-20533895-id-1651781.html
    找了一个早上,终于看到解决办法啦
    试过了,可以正确解决编码问题。
    至于byte输出的内容,是一个hashCode,网上有说明的,很容易找。