用jpcap实现网络抓包,现在包也抓到了,放在了一个byte数组里,我现在想看看这个包里是什么,但是转化完了输出是乱码,代码如下:
byte[] b = udpPac.data;
for(int i=0;i<b.length;i++){
   System.out.print((char)b[i]);
}百度说是因为要转化的byte数组里有超出ascii范围的值,我看了下,确实有,那要怎么才能转成功呢?

解决方案 »

  1.   

    可以将byte数组转化为String类型。
    比如:
    byte[] b = udpPac.data;  
    String s = new String(b);
    System.out.println(s);
      

  2.   

    byte 转 成String需要制定字符集,否则容易出现乱码问题。
      

  3.   

    JAVA所有的基本数字类型都是有符号的。所以byte的最大范围是-128~127。
    如果在文件或是网络中读到的是8位的无符号数时,可以用以下方法转换成int型
    byte b = ...;
    int i = b > 0 ? b : 256+b;
      

  4.   

    必须要事先知道这个byte[]的编码<encoding>是什么,然后使用new String(b, <encoding>)来将其转换成字符串即可,如果不知道,就只能试了(多数情况下无非就是UTF-8, GBK, ISO8859-1几种)。可以获取当前JDK支持的所有字符集,然后尝试用每个编码来转换,转换不抛出异常的就可能是你需要的。
      

  5.   

    楼主知道了包含超出ascii范围的值,就先转换为String,再输出char.
    String str = new String(b);
    char[] chars = str.toCharArray();
    for(int i =0 ; i < chars.length; i++){
    System.out.println(chars[i]);
    }
      

  6.   

    String str = new String(b);
    可以使用String(byte[] bytes, String charsetName) 这个构造方法替换,不要盲目的copy,学会自己思考。
      

  7.   

    lxbccsu大大,我就是用你说的这种的,没用啊~~~
      

  8.   

    在网上查了下,String s = new String(byte[] b); 原理是这样的:如果数组中的一个字节是正值,转换成2个字节的char,如果是负值,自动把byte[i]和它的下一个byte[i+1]合并成2字节的char,最后以String形式打印。
    已经看到了大部分实现了转码。但是在每个包的开头,都有极少的一段乱码,怀疑是包的头部
      

  9.   

    byte[] b = udpPac.data;
    StringBuffer sbs=new StringBuffer();
    for(int i=0;i<b.length;i++)
    {
        if (Integer.toHexString(b[i] & 0xFF).length() == 1)
        {
    sbs.append("0");
        }
        sbs.append(Integer.toHexString(b[i] & 0xFF));
    }
    System.out.println(sbs.toString());这样就转换成了一个16禁止的字符串,然后就可以用来分析了。
      

  10.   

    byte[] b = udpPac.data;
    这里抓的数据都不明确啊如果是像图片、视频之类的字节流文件,那就肯定是不行的;
    如果是文本文件,直接的用String也是不行的;java.io中的OutputStream及其子类来测试
      

  11.   

    new String(byte[])不行的吧,它使用系统默认的字符集去解析字节数组,若你抓包与系统默认字符集不同,就会乱码,
    7楼说的对,要用new string(byte[] data,String encoding)指定字符集才行。
      

  12.   

    jwl_xyc 大大,因为我要做DNS欺骗,封装的包头部分才是重点啊,因为要改校验和什么的。相对来说,包的数据倒不是很重要
      

  13.   

    lxbccsu 大大,不是我不想说清楚,实在是在jpcap提供的帮助文档中,关于data字段只有如下极少解释,别的啥也没有public byte[] data
    Packet data (excluding the header)