欲在字符串前加入一个头字节标识字符串长度。String str = "Test" ;
str = (char)(str.length()) + str;byte[] b = str.getbytes();然后打印 b按16进制的数值 得到的是 04 54 65 73 74 ,直接打印str 是 :Test
这是没有问题的现在
String str = "http://forum.csdn.net/PointForum/Forum/PostTopic.aspx?forumID=3d11cb76-8373-401d-9e9a-a6b24dd73eff3d11cb76-8373-401d-9e9a-a6b24dd73eff" ; //现在长度是134 = 0x86,大于0x7Fstr = (char)(str.length()) + str;byte[] b = str.getbytes();现在直接打印str,是这样的:
http://forum.csdn.net/PointForum/Forum/PostTopic.aspx?forumID=3d11cb76-8373-401d-9e9a-a6b24dd73eff3d11cb76-8373-401d-9e9a-a6b24dd73eff没问题好象,但是看b的十六进制数据成这样的了:81 30 81 36 68 74 74 70 3A 2F 2F 66 6F 72 75 .........
http是从第五个68 74 74 70后开始的,也就是说 0x86 这个字符被getbytes成了 81 30 81 36 实在很难理解,getbytes后,0x86这个8位的怎么就呼的一下给扩展到了32位呢?当然了,如果我手动强行转换还是可以的,(byte)0x86,这打印出来也确实是86,就是不知道在字符串中怎么构造才能把大于127的数按原数字进行传输呢?
str = (char)(str.length()) + str;byte[] b = str.getbytes();然后打印 b按16进制的数值 得到的是 04 54 65 73 74 ,直接打印str 是 :Test
这是没有问题的现在
String str = "http://forum.csdn.net/PointForum/Forum/PostTopic.aspx?forumID=3d11cb76-8373-401d-9e9a-a6b24dd73eff3d11cb76-8373-401d-9e9a-a6b24dd73eff" ; //现在长度是134 = 0x86,大于0x7Fstr = (char)(str.length()) + str;byte[] b = str.getbytes();现在直接打印str,是这样的:
http://forum.csdn.net/PointForum/Forum/PostTopic.aspx?forumID=3d11cb76-8373-401d-9e9a-a6b24dd73eff3d11cb76-8373-401d-9e9a-a6b24dd73eff没问题好象,但是看b的十六进制数据成这样的了:81 30 81 36 68 74 74 70 3A 2F 2F 66 6F 72 75 .........
http是从第五个68 74 74 70后开始的,也就是说 0x86 这个字符被getbytes成了 81 30 81 36 实在很难理解,getbytes后,0x86这个8位的怎么就呼的一下给扩展到了32位呢?当然了,如果我手动强行转换还是可以的,(byte)0x86,这打印出来也确实是86,就是不知道在字符串中怎么构造才能把大于127的数按原数字进行传输呢?
int 4字节32位这样用,晕,都知道第一个是表示长度的你还转byte[]!!!!
int len=str.charAt(0);
byte[] b = str.substring(1).getbytes();
[code=Java]
我这里的运行结果是正确的
3f 68 74 74 70 3a 2f 2f 66
//楼主要注意getBytes的默认编码是根据系统编码改变的[/code]
3f 68 74 74 70 3a 2f 2f 66 6f 72 75 6d 2e 63 73 64 6e 2e 6e 65 74 2f 50 6f 69 6e 74 46 6f 72 75 6d 2f 46 6f 72 75 6d 2f 50 6f 73 74 54 6f 70 69 63 2e 61 73 70 78 3f 66 6f 72 75 6d 49 44 3d 33 64 31 31 63 62 37 36 2d 38 33 37 33 2d 34 30 31 64 2d 39 65 39 61 2d 61 36 62 32 34 64 64 37 33 65 66 66 33 64 31 31 63 62 37 36 2d 38 33 37 33 2d 34 30 31 64 2d 39 65 39 61 2d 61 36 62 32 34 64 64 37 33 65 66 66
由于char是Unicode字符集,而getBytes windows下是gbk。而刚好你的长度字符串长度是Unicode编码中存在,但是在gbk中不存在的字符。所以java都解释成了?。你可以通过如下打印,看有多少是?
for(int i=128;i<256;i++){
byte[] bb=((char)i+"").getBytes();
for(byte b:bb){
System.out.println(b);
}
}
进一步说:
Unicode的上述段的字符集
http://www.nengcha.com/code/unicode/class/2/
从其中可以看出你的长度的字符是†
但是你在Eclipse中验证一下就知道,上述符号getBytes会提示你gbk不存在该字符的编码。如下。 char c='†';//
byte[] b = (c+"").getBytes();
解决办法:
byte[] b = ((char)str.length()+"").getBytes("unicode");
for(byte i:b){
if(i<0)
System.out.println(Integer.toHexString(i+256));
else
System.out.println(Integer.toHexString(i));
}
由于Unicode 采用的是big endian所以有两个字节的头(共四个字节),Unicode的编码都是两个字节,所以取后面两个字节即可。
+ "spx?forumID=3d11cb76-8373-401d-9e9a-a6"
+ "b24dd73eff3d11cb76-8373-401d-9e9a-a6b24dd"
+ "73eff" ; //现在长度是134 = 0x86,大于0x7Fstr = (char)(str.length()) + str;byte[] b = str.getbytes("ISO-8895-1");