Wireshark十六进制转储分析器在Java中可以做什么?

Wireshark十六进制转储分析器在Java中可以做什么?,java,hex,wireshark,Java,Hex,Wireshark,我有一个pcap文件,我可以使用wireshark查看hex和人类可读的字符串,相当于hexdump。但是,我想用Java做同样的事情。以下是Wireshark应用程序的屏幕截图 以突出显示的字符串为例,这是我得到的结果,但输出不是我所期望的。有人能帮我吗?多谢各位 String hex = "a106020110020138"; byte[] bts = new byte[hex.length() / 2]; for (int i = 0; i < bts.le

我有一个pcap文件,我可以使用wireshark查看hex和人类可读的字符串,相当于hexdump。但是,我想用Java做同样的事情。以下是Wireshark应用程序的屏幕截图

以突出显示的字符串为例,这是我得到的结果,但输出不是我所期望的。有人能帮我吗?多谢各位

    String hex = "a106020110020138";
    byte[] bts = new byte[hex.length() / 2];
    for (int i = 0; i < bts.length; i++) {
      bts[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
    }  
    String c = new String(bts, StandardCharsets.US_ASCII);
    System.out.println(c);
字符串hex=“A1060011002013”; 字节[]bts=新字节[hex.length()/2]; 对于(int i=0;i 这是输出:


Java使用UTF-16表示字符,我忘记了字节顺序,这意味着每个字符需要使用两个字节。

如果希望输出与Wireshark的完全相同,可以读取每组两个十六进制数字,并保留与可打印ASCII字符对应的十六进制数字:

public class Pcap {
    public static void main(String[] args) {
        String hex = "701c2f676c08a106020110020138";

        int n = hex.length();
        char[] cs = new char[n / 2];

        for (int i = 0; i < n; i+=2)
            cs[i/2] = (char) Integer.parseInt(hex.substring(i, i+2), 16);

        for (int i = 0; i < cs.length; i++)
            if (cs[i] < ' ' || cs[i] > '~') // printable ASCII
                cs[i] = '.';

        System.out.println(new String(cs));

    }
}
公共类Pcap{
公共静态void main(字符串[]args){
字符串hex=“701C2F676C08A1060201002013”;
int n=十六进制长度();
字符[]cs=新字符[n/2];
对于(int i=0;i'~')//可打印ASCII
cs[i]=';
System.out.println(新字符串(cs));
}
}
哪个输出

p./gl…….8


然而,我的猜测是,您最好使用一个可以解析PCAP的库(我之前提到过一个,它看起来也可能有用),因为首先获取十六进制字符串需要打开Wireshark。您可以自己编写代码,从(二进制)pcap文件中提取这些值,但是已经存在这样做的项目。

您看过这个库吗?我没有用过它,但它似乎能够阅读PCAP。那么,你期望的产出是什么?Wireshark不会转换为“人类可读的字符串等价物”,它所做的只是将可显示ASCII范围内的字符(空格至波浪号)显示为字符,而将所有其他字符显示为句点。一种非常常见的显示原始二进制数据的方法。@johncip,我只是使用pcap文件来显示我想要实现的目标,但从技术上讲,我将接收十六进制转储。@Jongware,我想查看“GSM移动应用程序”、“组件:调用(1)”等,可能是Wireshark提供的所有详细信息。有可能吗?嗯,我真的不知道。查看tshark可能会有所帮助,它是Wireshark的命令行版本,可以进行实际捕获,然后将数据解码为可读的内容。十六进制转储实际上来自于读取包含类似Wireshark表示的数据的ss7对话卡。更改代码以使字节数组为hex.length()而不是hex.length/2,然后写入bts[2*i]或bts[2*i+1]。哪一个是正确的取决于JVM的字节顺序,我不确定这一点。不,我不会发布代码,不,我现在不能测试我的答案。我觉得我的答案足以解决这个问题,尽管投票结果不乐观。