pwnr/
util.rs

1pub mod cyclic;
2pub mod memory_base;
3
4use std::io::stdin;
5
6use crate::error::Result;
7
8pub fn pause() {
9	println!("Paused - waiting on newline");
10	let mut pause = String::new();
11	stdin().read_line(&mut pause).unwrap();
12}
13
14// Little-endian packing convenience functions
15pub fn p8l(addr: u8) -> [u8; 1] { addr.to_le_bytes() }
16pub fn u8l(bytes: [u8; 1]) -> u8 { u8::from_le_bytes(bytes) }
17pub fn p16l(addr: u16) -> [u8; 2] { addr.to_le_bytes() }
18pub fn u16l(bytes: [u8; 2]) -> u16 { u16::from_le_bytes(bytes) }
19pub fn p32l(addr: u32) -> [u8; 4] { addr.to_le_bytes() }
20pub fn u32l(bytes: [u8; 4]) -> u32 { u32::from_le_bytes(bytes) }
21pub fn p64l(addr: u64) -> [u8; 8] { addr.to_le_bytes() }
22pub fn u64l(bytes: [u8; 8]) -> u64 { u64::from_le_bytes(bytes) }
23
24// Big-endian packing convenience functions
25pub fn p8b(addr: u8) -> [u8; 1] { addr.to_be_bytes() }
26pub fn u8b(bytes: [u8; 1]) -> u8 { u8::from_be_bytes(bytes) }
27pub fn p16b(addr: u16) -> [u8; 2] { addr.to_be_bytes() }
28pub fn u16b(bytes: [u8; 2]) -> u16 { u16::from_be_bytes(bytes) }
29pub fn p32b(addr: u32) -> [u8; 4] { addr.to_be_bytes() }
30pub fn u32b(bytes: [u8; 4]) -> u32 { u32::from_be_bytes(bytes) }
31pub fn p64b(addr: u64) -> [u8; 8] { addr.to_be_bytes() }
32pub fn u64b(bytes: [u8; 8]) -> u64 { u64::from_be_bytes(bytes) }
33
34pub fn num_from_hex(buf: impl AsRef<[u8]>) -> Result<u64> {
35	let parsed = std::str::from_utf8(buf.as_ref())?;
36	let value = u64::from_str_radix(parsed, 16)?;
37	Ok(value)
38}
39
40pub fn num_from_dec(buf: impl AsRef<[u8]>) -> Result<u64> {
41	let parsed = std::str::from_utf8(buf.as_ref())?;
42	let value = u64::from_str_radix(parsed, 10)?;
43	Ok(value)
44}