关于字符串编码后再解码的问题

luger 发布于 2013/08/14 17:40
阅读 244
收藏 0
public class anotherTest {
	public static void main(String[] args) throws UnsupportedEncodingException {
		byte[] bytes = {6, 8, 4, 0, 1, 2, 1, 117, 49, 78, -114, 78, 14, 123, 44, 78, 9, 101, -71, 84, 8, 79, 92, -116, 3, 101, 116, -1, 12, 102, -126, 80, 92, -117, -35, -115, 57, 101, 47, 78, -40, 81, 81, 99, 98, 98, 75, 103, 58, 101, 47, 78, -40, 117, 53, 91, 80, 82, 56, -1, 8, 84, 43, 81, 108, 78, -92, 78, 0, 83, 97, -112, 26, 117, 53, 91, 80, 82, 56, -1, 9, 78, 26, 82, -95, 48, 2, -117, -9, 96, -88, -112, 9, 98, -23, 81, 118, 78, -42, 83, -17, -115, 45, 78, 112, 78, -89, 84, -63, 48, 2, -117, -35, -115, 57, 101, 47, 78, -40, 83, -17, -115, 45, 78, 112, 118, -124};
		System.out.println("解码前:"+Arrays.toString(bytes));
		String tempS = new String(bytes, "UTF-16BE");//得到的tempS就是乱码了
		byte[] btmp = tempS.getBytes("GBK");
		String result = Base64.encode(btmp);

		byte[] rBtemp = Base64.decode(result);
		String rTempS = new String(rBtemp,"GBK");
		byte[] rBytes = rTempS.getBytes("UTF-16BE");
		System.out.println("解码后:"+Arrays.toString(rBytes));
		

	}
}

谁能帮我看看为什么解码后和解码前的不一样了
加载中
0
xue777hua
xue777hua

编码和解码用的Encoding都不一样!要么统一用UTF-16BE,要么用以用GBK。这么说吧,你看UTF-16BE虽然用的也是2个字节的,于是开头的6和8组成的2个字节被对应到了UTF-16BE中的一个字符,正好6和8这两个字节在GBK中没有对应字符,故而信息就丢失了。所以如果你编码和解码一定要用同一种来解码。如果你真的想用不同的话,一定要是兼容的编码。比如GBK和GB2312,GB2312转成GBK,信息不会丢失,代码如下:

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
public class Main2 {
	public static void main(String[] args) throws UnsupportedEncodingException {
		byte[] bytes = "o(╯□╰)o?".getBytes("GB2312");
		System.out.println("解码前:" + Arrays.toString(bytes));
		String tempS = new String(bytes, "GB2312");// 得到的tempS就是乱码了
		byte[] btmp = tempS.getBytes("GBK");
		String result = Base64.encode(btmp);
		byte[] rBtemp = Base64.decode(result);
		String rTempS = new String(rBtemp, "GBK");
		byte[] rBytes = rTempS.getBytes("GB2312");
		System.out.println("解码后:" + Arrays.toString(rBytes));
	}
}
输出结果:

解码前:[111, 40, 63, -95, -11, 63, 41, 111, -93, -65]
解码后:[111, 40, 63, -95, -11, 63, 41, 111, -93, -65]



0
中山野鬼
中山野鬼
 凌乱了我。。。搞编解码还有负值出来。。。。楼主记得0x描述。。。
0
xue777hua
xue777hua

引用来自“中山野鬼”的答案

 凌乱了我。。。搞编解码还有负值出来。。。。楼主记得0x描述。。。
这个是Byte啊。。。不是编码的真实形态啊~~~莫被欺骗了啊
0
xue777hua
xue777hua

引用来自“xue777hua”的答案

引用来自“中山野鬼”的答案

 凌乱了我。。。搞编解码还有负值出来。。。。楼主记得0x描述。。。
这个是Byte啊。。。不是编码的真实形态啊~~~莫被欺骗了啊
是不是如果转换成10000101100101001你就觉得正常了?
0
中山野鬼
中山野鬼

引用来自“xue777hua”的答案

引用来自“xue777hua”的答案

引用来自“中山野鬼”的答案

 凌乱了我。。。搞编解码还有负值出来。。。。楼主记得0x描述。。。
这个是Byte啊。。。不是编码的真实形态啊~~~莫被欺骗了啊
是不是如果转换成10000101100101001你就觉得正常了?
编解码都是根据bits位来的。如果搞编解码,对 2位16进制,转换为10进制,或者2进制不能心算,就应该好好多练练。傻瓜才写成二进制呢。不过编解码本身确实是bits操作。就是看到16进制,也应该脑袋里立刻出来2进制是什么。这是基本功。和用什么语言没关系。
0
宏哥
宏哥

引用来自“中山野鬼”的答案

引用来自“xue777hua”的答案

引用来自“xue777hua”的答案

引用来自“中山野鬼”的答案

 凌乱了我。。。搞编解码还有负值出来。。。。楼主记得0x描述。。。
这个是Byte啊。。。不是编码的真实形态啊~~~莫被欺骗了啊
是不是如果转换成10000101100101001你就觉得正常了?
编解码都是根据bits位来的。如果搞编解码,对 2位16进制,转换为10进制,或者2进制不能心算,就应该好好多练练。傻瓜才写成二进制呢。不过编解码本身确实是bits操作。就是看到16进制,也应该脑袋里立刻出来2进制是什么。这是基本功。和用什么语言没关系。

你天天搞七搞八, 是不是忘记了两个凡是

忘记了自己要干什么?

返回顶部
顶部