我用java做了一个给文字加密的程序。比如一段文字,将每个汉字转成unicode编码,再进一步转成16位的二进制表示。
1011001110101111111010111100101110001011000001110000000000000000
这串64位编码是由几个汉字转换来的,经过des算法之后,它变成了
0101110010000011000101001101000101001111000100111001001011010010
这其中每一个8位是经过倒置了的
将每8位转换成byte格式,可以得到58 -63 40 -117 -14 -56 73 75
然后将这个byte[]转化成了字符串。第一个58转成了冒号,而那个-117和-14在一起被转成了“嬺”字,-56和73在一起被转成了“菼”字,但是那个-63和40在一起貌似转出来的不是字,就直接显示成了一个问号。
当我再把这个字符串转成unicode时,除了问号那个地方,其他地方都对,但是问号却直接被转成'?'的ASCII码63,结果变成了58 63 -117 -14 -56 73 75 ,于是再转成二进制编码再解密的结果就不对了。请问应该如何避免这种现象?
1011001110101111111010111100101110001011000001110000000000000000
这串64位编码是由几个汉字转换来的,经过des算法之后,它变成了
0101110010000011000101001101000101001111000100111001001011010010
这其中每一个8位是经过倒置了的
将每8位转换成byte格式,可以得到58 -63 40 -117 -14 -56 73 75
然后将这个byte[]转化成了字符串。第一个58转成了冒号,而那个-117和-14在一起被转成了“嬺”字,-56和73在一起被转成了“菼”字,但是那个-63和40在一起貌似转出来的不是字,就直接显示成了一个问号。
当我再把这个字符串转成unicode时,除了问号那个地方,其他地方都对,但是问号却直接被转成'?'的ASCII码63,结果变成了58 63 -117 -14 -56 73 75 ,于是再转成二进制编码再解密的结果就不对了。请问应该如何避免这种现象?
答:问题发生在:然后将这个byte[]转化成了字符串。你是用什么编码将byte[]转换字符串的?
正确的转换方式是:
String s=new String(b,"iso-8859-1");
这个s就不会有信息丢失了。可以正确地再转回去进行解密了。
我是直接用String s=new String(byte[])的。
即使改成String s=new String(byte[],"GBK"),结果也是跟不加是一样的,按LS的方法就会出现更多的问号,凡是非ascii字符都是问号了
而我的方法是:你现在的字节数组b是:58 -63 40 -117 -14 -56 73 75 ,当你用:String s=new String(byte[],"ISO-8859-1")时,那个串中当然也会出现?,但是:在转换过程中没有信息丢失,你再用getBytes("ISO-8859-1")时,就能正确解密了.
核心是:转换过程不能有信息丢失.否则不能正确解密.