欲在字符串前加入一个头字节标识字符串长度。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的数按原数字进行传输呢?

解决方案 »

  1.   

    我打出来的是:6a 68 74 74 70 3a 2f 2f 66应该是你说的正常吧。
      

  2.   

    不对啊,要大于0x7F,6a是肯定没问题的,小于7F的都没事的
      

  3.   

    char,short 2字节16位
    int 4字节32位这样用,晕,都知道第一个是表示长度的你还转byte[]!!!!
    int len=str.charAt(0);
    byte[] b = str.substring(1).getbytes();
      

  4.   

    硬塞进去结果 getbytes 出来 表示长度的字符 变成4个字节的了
      

  5.   


    [code=Java]
    我这里的运行结果是正确的
    3f 68 74 74 70 3a 2f 2f 66
    //楼主要注意getBytes的默认编码是根据系统编码改变的[/code]
      

  6.   


    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 
      

  7.   

    原因如下:
    由于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的编码都是两个字节,所以取后面两个字节即可。
      

  8.   

    :) :) :) String str = "http://forum.csdn.net/PointForum/Forum/PostTopic.a"
                 + "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");