gets frames
This commit is contained in:
parent
68757371a0
commit
45dfbd6d66
21
thermalcamdecoder/Cargo.lock
generated
21
thermalcamdecoder/Cargo.lock
generated
|
@ -234,6 +234,26 @@ version = "1.2.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.193"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.193"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.11.2"
|
||||
|
@ -264,6 +284,7 @@ dependencies = [
|
|||
"anyhow",
|
||||
"pcap-parser",
|
||||
"pyo3",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
@ -9,3 +9,4 @@ edition = "2021"
|
|||
anyhow = "1.0.77"
|
||||
pcap-parser = { version = "0.14.1", features = ["data"] }
|
||||
pyo3 = "0.20.0"
|
||||
serde = { version = "1.0.193", features = ["derive", "serde_derive", "alloc"] }
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
use std::fs::File;
|
||||
use std::io::Write;
|
||||
|
||||
use pcap_parser::traits::PcapReaderIterator;
|
||||
use pcap_parser::*;
|
||||
|
||||
fn main() -> anyhow::Result<()> {
|
||||
fn get_packets_without_udp_header() -> anyhow::Result<(Vec<Vec<u8>>, usize, usize)> {
|
||||
let file = File::open("in.pcap")?;
|
||||
let mut cap = PcapNGReader::new(65535, file)?;
|
||||
let mut i = 0;
|
||||
|
@ -54,7 +55,74 @@ fn main() -> anyhow::Result<()> {
|
|||
}
|
||||
}
|
||||
}
|
||||
Ok((data, i, size))
|
||||
}
|
||||
|
||||
#[repr(C, packed)]
|
||||
#[derive(Clone, Debug)]
|
||||
struct Header {
|
||||
c1: u32,
|
||||
c2: u16,
|
||||
part: u16,
|
||||
a: u16,
|
||||
ffaa: u16,
|
||||
b: u16,
|
||||
c: u16,
|
||||
d: u16,
|
||||
}
|
||||
|
||||
impl Header {
|
||||
fn read(data: &[u8]) -> anyhow::Result<Self> {
|
||||
Ok(Header {
|
||||
c1: u32::from_be_bytes([data[0], data[1], data[2], data[3]]),
|
||||
c2: u16::from_be_bytes([data[4], data[5]]),
|
||||
part: u16::from_be_bytes([data[6], data[7]]),
|
||||
a: u16::from_be_bytes([data[8], data[9]]),
|
||||
ffaa: u16::from_be_bytes([data[10], data[11]]),
|
||||
b: u16::from_be_bytes([data[12], data[13]]),
|
||||
c: u16::from_be_bytes([data[14], data[15]]),
|
||||
d: u16::from_be_bytes([data[16], data[17]]),
|
||||
})
|
||||
}
|
||||
|
||||
fn read_via_cast(data: &[u8]) -> anyhow::Result<&Self> {
|
||||
let size = std::mem::size_of::<Self>();
|
||||
if data.len() < size {
|
||||
return Err(anyhow::anyhow!("not large enough"));
|
||||
}
|
||||
let mem = &data[..size].as_ptr();
|
||||
Ok(unsafe { &*mem.cast() })
|
||||
}
|
||||
}
|
||||
|
||||
const HDR_SIZE: usize = std::mem::size_of::<Header>();
|
||||
|
||||
fn main() -> anyhow::Result<()> {
|
||||
let (data, i, size) = get_packets_without_udp_header()?;
|
||||
|
||||
println!("found {} packets, saved {}, {} size", i, data.len(), size);
|
||||
println!("{:+?}", data);
|
||||
let mut dump = File::create_new("dump.bin");
|
||||
let mut frames = vec![];
|
||||
let mut parts = None;
|
||||
for packet in data.iter() {
|
||||
if let Ok(ref mut dump) = dump {
|
||||
dump.write_all(&packet);
|
||||
}
|
||||
let hdr = Header::read(packet)?;
|
||||
let data = packet[HDR_SIZE..].to_vec();
|
||||
match parts {
|
||||
None => {
|
||||
parts = Some(vec![data]);
|
||||
}
|
||||
Some(ref mut v) => {
|
||||
v.push(data);
|
||||
if hdr.part == 0 {
|
||||
frames.push(parts.take());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
println!("found {} frames", frames.len());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user