Ini adalah file PCAP parsing sederhana yang ditulis sendiri, yang nyaman untuk membaca file PCAP.
Salinan kode adalah sebagai berikut:
InputStream adalah = dataparser.class.getClassLoader (). GetResourceAsstream ("baidu_cdr.pcap");
PCAP PCAP = pcapparser.unpack (IS);
is.close ();
byte [] t = pcap.getData (). get (0) .getContent ();
byte [] data = arrays.copyofrange (t, 42, t.length);
Pcapparser.java
Salinan kode adalah sebagai berikut:
paket com.hylanda.pcap;
impor java.io.ioException;
impor java.io.inputstream;
impor java.util.arraylist;
impor java.util.list;
/**
* @Author Zhouqisheng
*
*/
PCApparser kelas publik {
public static pcap unpack (inputstream is) melempar ioException {
PCAP PCAP = NULL;
byte [] buffer_4 = byte baru [4];
byte [] buffer_2 = byte baru [2];
PCAP = PCAP baru ();
Header pcapheader = pcapheader baru ();
int m = is.read (buffer_4);
if (m! = 4) {
kembali nol;
}
ReversebyTeArray (buffer_4);
header.setMagic (bytearraytoint (buffer_4, 0));
m = is.read (buffer_2);
ReversebyTeArray (buffer_2);
header.setMagor_version (bytearraytoshort (buffer_2, 0));
m = is.read (buffer_2);
ReversebyTeArray (buffer_2);
header.setminor_version (bytearraytoshort (buffer_2, 0));
m = is.read (buffer_4);
ReversebyTeArray (buffer_4);
header.settimezone (bytearraytoint (buffer_4, 0));
m = is.read (buffer_4);
ReversebyTeArray (buffer_4);
header.setsigflags (bytearraytoint (buffer_4, 0));
m = is.read (buffer_4);
ReversebyTeArray (buffer_4);
header.setsnaplen (bytearraytoint (buffer_4, 0));
m = is.read (buffer_4);
ReversebyTeArray (buffer_4);
header.setLinkType (bytearraytoint (buffer_4, 0));
pcap.setheader (header);
Daftar <CapApData> datalist = ArrayList baru <CapApData> ();
while (m> 0) {
Data pcapdata = pcapdata baru ();
m = is.read (buffer_4);
if (m <0) {
merusak;
}
ReversebyTeArray (buffer_4);
data.settime_s (bytearraytoint (buffer_4, 0));
m = is.read (buffer_4);
ReversebyTeArray (buffer_4);
data.settime_ms (bytearraytoint (buffer_4, 0));
m = is.read (buffer_4);
ReversebyTeArray (buffer_4);
data.setPlength (bytearraytoint (buffer_4, 0));
m = is.read (buffer_4);
ReversebyTeArray (buffer_4);
data.setLength (bytearraytoint (buffer_4, 0));
byte [] content = byte baru [data.getplength ()];
m = is.read (konten);
data.setContent (konten);
datalist.add (data);
}
pcap.setData (Datasist);
mengembalikan pcap;
}
private static int bytearraytoint (byte [] b, int offset) {
nilai int = 0;
untuk (int i = 0; i <4; i ++) {
int shift = (4 - 1 - i) * 8;
nilai + = (b [i + offset] & 0x000000ff) << shift;
}
nilai pengembalian;
}
private static pendek bytearraytoshort (byte [] b, int offset) {
nilai pendek = 0;
untuk (int i = 0; i <2; i ++) {
int shift = (2 - 1 - i) * 8;
nilai + = (b [i + offset] & 0x000000ff) << shift;
}
nilai pengembalian;
}
/**
* Membalikkan array
* @param arr
*/
private static void reversebyTeArray (byte [] arr) {
Byte Temp;
int n = arr.length;
untuk (int i = 0; i <n/2; i ++) {
temp = arr [i];
arr [i] = arr [n-1-i];
arr [n-1-i] = temp;
}
}
}
Pcap.java
Salinan kode adalah sebagai berikut:
/**
*
*/
paket com.hylanda.pcap;
impor java.util.list;
/**
* @Author Zhouqisheng
*
*/
PCAP kelas publik {
header pcapheader pribadi;
DAFTAR PRIBADI <CapData> data;
PCAPHEADER PUBLIK GetHeader () {
header kembali;
}
public void setHeader (pcapheader header) {
this.header = header;
}
Daftar Publik <CapapData> getData () {
pengembalian data;
}
public void setData (Daftar <CapapData> data) {
this.data = data;
}
@Mengesampingkan
Public String ToString () {
StringBuilder S = New StringBuilder ();
S.Append ("Header {/n");
s. lampai (header.tostring ());
s. lampai ("}/n");
S. lampai ("Data Part Count ="). Append (data.size ());
return s.tostring ();
}
}
Pcapdata.java
Salinan kode adalah sebagai berikut:
paket com.hylanda.pcap;
/**
* @Author Zhouqisheng
* Header paket
*/
PCAPData kelas publik {
private int time_s; // timestamp (detik)
private int time_ms; // timestamp (halus)
Panjang int private; // panjang paket
panjang int pribadi; // panjang aktual
konten byte pribadi []; // data
public int gettime_s () {
return time_s;
}
public void setTime_s (int time_s) {
this.time_s = time_s;
}
public int gettime_ms () {
return time_ms;
}
public void setTime_MS (int time_ms) {
this.time_ms = time_ms;
}
publik int getPlength () {
mengembalikan panjang;
}
public void setPlength (int panjang) {
this.plength = panjang;
}
publik int getLength () {
panjang pengembalian;
}
public void setlength (int panjang) {
this.length = panjang;
}
byte publik [] getContent () {
mengembalikan konten;
}
public void setContent (byte [] konten) {
this.content = konten;
}
@Mengesampingkan
Public String ToString () {
StringBuilder S = New StringBuilder ();
s. lampan ("time_s ="). append (this.time_s);
s. lampan ("/nTime_ms ="). Tambahkan (this.time_ms);
s. lampai ("/nplength ="). append (this.plength);
s. lampai ("/nlength ="). append (this.length);
kembali nol;
}
}
Pcapheader.java
Salinan kode adalah sebagai berikut:
paket com.hylanda.pcap;
/**
* @Author Zhouqisheng
* header file PCAP
*/
PCAPHEADER kelas publik {
Private Int Magic; // Header Pengenalan File, 0xA1B2C3D4
private short magor_version; // versi utama
private short minor_version; // versi minor
Private int TimeZone; // Waktu Standar Lokal
sigflag int private; // keakuratan cap waktu
private int snaplen; // panjang penyimpanan maksimum
/**
* 0 Perangkat Loopback BSD, kecuali untuk OpenBSD nanti
1 Perangkat Ethernet, dan Linux
6 802.5 Token Ring
7 Arcnet
8 slip
9 ppp
10 fddi
100 LLC/ATM yang dienkapsulasi snap
101 "IP mentah", tanpa tautan
102 Slip BSD/OS
103 BSD/OS PPP
104 Cisco HDLC
105 802.11
108 Perangkat Loopback OpenBSD kemudian (dengan AF_Value dalam Urutan Byte Jaringan)
113 Linux Khusus "Dimasak" Capture
114 LocalTalk
*/
private int linkType; // tipe tautan
public int getMagic () {
kembali keajaiban;
}
public void setMagic (int magic) {
this.magic = sihir;
}
getMagor_version pendek publik () {
mengembalikan magor_version;
}
public void setMagor_version (magor_version pendek) {
this.magor_version = magor_version;
}
getminor_version pendek publik () {
mengembalikan minor_version;
}
public void setminor_version (minor_version pendek) {
this.minor_version = minor_version;
}
publik int getTimeZone () {
Return Timezone;
}
public void setTimeZone (int timeZone) {
this.timezone = timeZone;
}
int int getsigflags () {
mengembalikan SigFlags;
}
public void setsigflags (int sigflags) {
this.sigflags = sigflags;
}
int int getsnaplen () {
mengembalikan Snaplen;
}
public void setSnaplen (int snaplen) {
this.snaplen = snapplen;
}
public int getLinkType () {
return linkType;
}
public void setLinkType (int linkType) {
this.linkType = linkType;
}
@Mengesampingkan
Public String ToString () {
StringBuilder S = New StringBuilder ();
S.Append ("Magic ="). Append ("0x" + Integer.tohexstring (this.magic));
S.Append ("/nmagor_version ="). Append (this.magor_version);
S.Append ("/nminor_version ="). Append (this.minor_version);
S. lampai ("/nTimeZone ="). Tambahkan (this.TimeZone);
s. lampai ("/nsigflags ="). append (this.sigflags);
s. lampai ("/nsnaplen ="). append (this.snaplen);
S.Append ("/nlinkType ="). Append (this.linkType);
return s.tostring ();
}
}