前言
数据结构已经定义好了,那么现在就开始正式解析Pcap文件了。
注:以下仅贴出核心代码,项目全部代码会在文章结尾处给出下载链接
解析Pcap文件
1 读取整个Pcap文件到内存
FileInputStream fis = null;
try {
fis = new FileInputStream(pcap);
int m = fis.read(file_header);
//....
} catch // .....
2 读取文件头
/**
* 读取 pcap 文件头
*/
public PcapFileHeader parseFileHeader(byte[] file_header) throws IOException {
PcapFileHeader fileHeader = new PcapFileHeader();
byte[] buff_4 = new byte[4]; // 4 字节的数组
byte[] buff_2 = new byte[2]; // 2 字节的数组
int offset = 0;
for (int i = 0; i < 4; i ++) {
buff_4[i] = file_header[i + offset];
}
offset += 4;
int magic = DataUtils.byteArrayToInt(buff_4);
fileHeader.setMagic(magic);
for (int i = 0; i < 2; i ++) {
buff_2[i] = file_header[i + offset];
}
offset += 2;
short magorVersion = DataUtils.byteArrayToShort(buff_2);
fileHeader.setMagorVersion(magorVersion);
for (int i = 0; i < 2; i ++) {
buff_2[i] = file_header[i + offset];
}
offset += 2;
short minorVersion = DataUtils.byteArrayToShort(buff_2);
fileHeader.setMinorVersion(minorVersion);
for (int i = 0; i < 4; i ++) {
buff_4[i] = file_header[i + offset];
}
offset += 4;
int timezone = DataUtils.byteArrayToInt(buff_4);
fileHeader.setTimezone(timezone);
for (int i = 0; i < 4; i ++) {
buff_4[i] = file_header[i + offset];
}
offset += 4;
int sigflags = DataUtils.byteArrayToInt(buff_4);
fileHeader.setSigflags(sigflags);
for (int i = 0; i < 4; i ++) {
buff_4[i] = file_header[i + offset];
}
offset += 4;
int snaplen = DataUtils.byteArrayToInt(buff_4);
fileHeader.setSnaplen(snaplen);
for (int i = 0; i < 4; i ++) {
buff_4[i] = file_header[i + offset];
}
offset += 4;
int linktype = DataUtils.byteArrayToInt(buff_4);
fileHeader.setLinktype(linktype);
// LogUtils.printObjInfo(fileHeader);
return fileHeader;
}
3 读取数据头
/**
* 读取数据包头
*/
public PcapDataHeader parseDataHeader(byte[] data_header){
byte[] buff_4 = new byte[4];
PcapDataHeader dataHeader = new PcapDataHeader();
int offset = 0;
for (int i = 0; i < 4; i ++) {
buff_4[i] = data_header[i + offset];
}
offset += 4;
int timeS = DataUtils.byteArrayToInt(buff_4);
dataHeader.setTimeS(timeS);
for (int i = 0; i < 4; i ++) {
buff_4[i] = data_header[i + offset];
}
offset += 4;
int timeMs = DataUtils.byteArrayToInt(buff_4);
dataHeader.setTimeMs(timeMs);
for (int i = 0; i < 4; i ++) {
buff_4[i] = data_header[i + offset];
}
offset += 4;
// 得先逆序在转为 int
DataUtils.reverseBy