(&self)
| 151 | } |
| 152 | |
| 153 | pub fn to_bytes(&self) -> Vec<u8> { |
| 154 | let mut headers: Vec<_> = self |
| 155 | .streams |
| 156 | .iter() |
| 157 | .filter(|(_, data)| !data.bytes.is_empty()) |
| 158 | .map(|(addr, data)| (*addr, data.bytes.len() as u64)) |
| 159 | .collect(); |
| 160 | headers.sort_unstable(); |
| 161 | |
| 162 | // Output format: |
| 163 | // |
| 164 | // FILE_HEADER |
| 165 | // number of mmio addresses: u32le, |
| 166 | // [(mmio1.address: u64le, mmio1.len: u64le), ...], |
| 167 | // [mmio1.bytes...] |
| 168 | let mut out = FILE_HEADER.to_vec(); |
| 169 | out.extend_from_slice(&(headers.len() as u32).to_le_bytes()); |
| 170 | for (addr, len) in &headers { |
| 171 | out.extend_from_slice(&addr.to_le_bytes()); |
| 172 | out.extend_from_slice(&len.to_le_bytes()); |
| 173 | } |
| 174 | |
| 175 | for (addr, _) in headers { |
| 176 | out.extend_from_slice(&self.streams[&addr].bytes); |
| 177 | } |
| 178 | out |
| 179 | } |
| 180 | |
| 181 | pub fn from_bytes(buf: &[u8]) -> Option<Self> { |
| 182 | use byteorder::{ReadBytesExt, LE}; |
no test coverage detected