我有一个pcap文件,我可以使用wireshark查看十六进制和人类可读的字符串相当于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);
这是输出:
答案 0 :(得分:0)
Java使用UTF-16表示字符,按照我忘记的字节顺序,这意味着每个字符需要使用两个字节。
答案 1 :(得分:0)
如果您希望输出看起来与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));
}
}
输出
p./gl........8
然而,我的猜测是你最好使用一个可以解析pcaps的库(我之前提到过,看起来http://jpcap.sourceforge.net也可能有效),因为只是首先得到那个十六进制字符串需要打开Wireshark。您可以自己编写代码以从(二进制)pcap文件中提取这些值,但是已经存在项目来执行此操作。