pwn_helper/
numbers.rs

1use std::fmt::{Display, LowerHex};
2
3use crate::Endianness;
4
5pub fn hex<Value: LowerHex>(value: Value) -> String {
6    format!("{:x}", value)
7}
8
9pub fn decimal<Value: Display>(value: Value) -> String {
10    format!("{}", value)
11}
12
13pub fn p8(value: u8) -> Vec<u8> {
14    vec![value]
15}
16
17pub fn unhex8(value: &[u8]) -> u8 {
18    u8::from_str_radix(String::from_utf8_lossy(&value[2..]).as_ref(), 16).unwrap()
19}
20
21pub fn u8(value: &[u8]) -> u8 {
22    value[0]
23}
24
25pub fn p16(value: u16, endianness: Endianness) -> [u8; 2] {
26    match endianness {
27        Endianness::Little => value.to_le_bytes(),
28        Endianness::Big => value.to_be_bytes(),
29    }
30}
31
32pub fn unhex16(value: &[u8]) -> u16 {
33    u16::from_str_radix(String::from_utf8_lossy(&value[2..]).as_ref(), 16).unwrap()
34}
35
36pub fn u16(value: &[u8], endianness: Endianness) -> u16 {
37    match endianness {
38        Endianness::Little => {
39            u16::from_le_bytes(value.try_into().expect("byte array not big enough"))
40        }
41        Endianness::Big => u16::from_be_bytes(value.try_into().expect("byte array not big enough")),
42    }
43}
44
45pub fn p32(value: u32, endianness: Endianness) -> [u8; 4] {
46    match endianness {
47        Endianness::Little => value.to_le_bytes(),
48        Endianness::Big => value.to_be_bytes(),
49    }
50}
51
52pub fn unhex32(value: &[u8]) -> u32 {
53    u32::from_str_radix(String::from_utf8_lossy(&value[2..]).as_ref(), 16).unwrap()
54}
55
56pub fn u32(value: &[u8], endianness: Endianness) -> u32 {
57    match endianness {
58        Endianness::Little => {
59            u32::from_le_bytes(value.try_into().expect("byte array not big enough"))
60        }
61        Endianness::Big => u32::from_be_bytes(value.try_into().expect("byte array not big enough")),
62    }
63}
64
65pub fn p64(value: u64, endianness: Endianness) -> [u8; 8] {
66    match endianness {
67        Endianness::Little => value.to_le_bytes(),
68        Endianness::Big => value.to_be_bytes(),
69    }
70}
71
72pub fn unhex64(value: &[u8]) -> u64 {
73    u64::from_str_radix(String::from_utf8_lossy(&value[2..]).as_ref(), 16).unwrap()
74}
75
76pub fn u64(value: &[u8], endianness: Endianness) -> u64 {
77    match endianness {
78        Endianness::Little => {
79            u64::from_le_bytes(value.try_into().expect("byte array not big enough"))
80        }
81        Endianness::Big => u64::from_be_bytes(value.try_into().expect("byte array not big enough")),
82    }
83}
84
85pub fn p128(value: u128, endianness: Endianness) -> [u8; 16] {
86    match endianness {
87        Endianness::Little => value.to_le_bytes(),
88        Endianness::Big => value.to_be_bytes(),
89    }
90}
91
92pub fn unhex128(value: &[u8]) -> u128 {
93    u128::from_str_radix(String::from_utf8_lossy(&value[2..]).as_ref(), 16).unwrap()
94}
95
96pub fn u128(value: &[u8], endianness: Endianness) -> u128 {
97    match endianness {
98        Endianness::Little => {
99            u128::from_le_bytes(value.try_into().expect("byte array not big enough"))
100        }
101        Endianness::Big => {
102            u128::from_be_bytes(value.try_into().expect("byte array not big enough"))
103        }
104    }
105}