Rust 将pcap数据包写入不带文件头的文件

Rust 将pcap数据包写入不带文件头的文件,rust,wireshark,python-2.x,pcap,libpcap,Rust,Wireshark,Python 2.x,Pcap,Libpcap,我有一个pcap::Packet,希望将其写入不带pcap文件头的文件,并在稍后的Python中添加文件头。我知道关于pcap::Savefile的信息,但不幸的是,我无法使用它,因为它会自动写入pcap文件头 我试过类似的东西 外部板条箱pcap; 使用std::{fs::OpenOptions,io::Write,mem,slice}; 常数DLT_IEEE802_11_无线电:i32=127; 常数SNAPLEN:i32=4096; 任何不安全的fn作为u8切片(p:&T)->和[u8

我有一个
pcap::Packet
,希望将其写入不带pcap文件头的文件,并在稍后的Python中添加文件头。我知道关于pcap::Savefile的信息,但不幸的是,我无法使用它,因为它会自动写入pcap文件头

我试过类似的东西

外部板条箱pcap;
使用std::{fs::OpenOptions,io::Write,mem,slice};
常数DLT_IEEE802_11_无线电:i32=127;
常数SNAPLEN:i32=4096;
任何不安全的fn作为u8切片(p:&T)->和[u8]{
切片::来自原始零件((p为*常数T)为*常数u8,mem::大小为::())
}
fn main(){
让mut capture=pcap::capture::from_设备(pcap::device::lookup().unwrap())
.unwrap()
.超时(1)
.rfmon(真)
.斯内普伦(斯内普伦)
.open()
.unwrap();
捕获
.set_数据链路(pcap::Linktype(DLT_IEEE802_11_无线电))
.unwrap();
让mut temp=OpenOptions::new()
.create(true)
.append(true)
.打开(“温度rawpcap”)
.unwrap();
让mut count=0;
当计数小于10时{
匹配捕获。下一步(){
Ok(数据包)=>{
计数+=1;
不安全{
temp.write_all(任意_作为_u8_片(packet.header)).unwrap();
}
temp.write_all(&packet.data).unwrap();
}
Err(pcap::Error::TimeoutExpired)=>继续,
错误(e)=>{
恐慌!(“未处理的错误:{:?}”,e);
}
}
}
}
我正在添加带有

导入结构
DLT_IEEE802_11_无线电=127
斯内普伦=4096
pcap\u file\u header=struct.pack('IHHiIII',0xa1b2c3d4,0x2,0x4,0,0,SNAPLEN,DLT\u IEEE802\u 11\u无线电)
以open('temp.rawpcap','rb')作为f:
data=f.read()
以open('temp.pcap','wb')作为f:
f、 写入(pcap文件头+数据)
当我在Wireshark中打开结果
.pcap
文件时,我得到

捕获文件似乎已损坏或损坏。
(pcap:文件包含560197字节的数据包,大于最大值262144)
以下是每个文件的hexdump(以256的SNAPLEN获取1个数据包):

$hextump-n 56 temp.rawpcap
0000000 d4 c5 8e 5b 00 00 00 43 78 02 00 00 00
0000010 00 01 00 50 01 00 14 a0 2e 09 01 00 00
0000020
$hexdump-n 56临时pcap
0000000 d4 c3 b2 a1 02 00 04 00 00 00 00
0000010 00 01 00 7f 00 00 d4 c5 8e 5b 00 00 00
0000020 43 78 02 00 00 00 00 00 00 01 00 00 50 01 00 00
0000030 14 a0 2e 09 01 00
0000038
根据,时间戳由两个32位值组成,但使用由两个64位值组成的

您不能将标题作为原始数据写入,您需要手动写入其字段:

temp.write_all(any_as_u8_slice(&(packet.header.ts.tv_sec as u32))).unwrap();
temp.write_all(any_as_u8_slice(&(packet.header.ts.tv_usec as u32))).unwrap();
temp.write_all(any_as_u8_slice(&packet.header.caplen)).unwrap();
temp.write_all(any_as_u8_slice(&packet.header.len)).unwrap();

由于您没有在任何地方指定字节顺序,因此您还需要确保在与运行Rust代码的机器具有相同endianness的机器上运行Python脚本。

您可以将
hextdump-n 56 temp.rawpcap
的输出添加到您的帖子中吗?它应该显示
.pcap
文件的前几个字节(56),这将使阅读您的问题的人更容易调试。非常感谢!我知道endianness的问题,这两个东西都在同一台机器上运行,所以很好。