use std::str;
#[derive(PartialEq, Debug, Copy, Clone)]
pub enum TextFormat {
Text,
Binary = 2,
Octal = 8,
Decimal = 10,
Hex = 16
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum NewlineFormat {
None,
CarriageReturn,
LineFeed,
Both
}
pub fn bytes_from_hex_string(original_text: &str) -> Result<Vec<u8>, String> {
let mut text = original_text.replace("0x", "");
text = text.replace(" ", "");
bytes_from_radix_string(&text, 16)
}
pub fn bytes_from_binary_string(original_text: &str) -> Result<Vec<u8>, String> {
let mut text = original_text.replace("0b", "");
text = text.replace(" ", "");
bytes_from_radix_string(&text, 2)
}
pub fn bytes_from_octal_string(original_text: &str) -> Result<Vec<u8>, String> {
let mut text = original_text.replace(" ", "");
if text.starts_with('0') {
text.remove(0);
}
bytes_from_radix_string(&text, 8)
}
pub fn bytes_from_decimal_string(original_text: &str) -> Result<Vec<u8>, String> {
let text = original_text.replace(" ", "");
bytes_from_radix_string(&text, 10)
}
pub fn bytes_from_radix_string(text: &str, radix: u32) -> Result<Vec<u8>, String> {
let mut bytes: Vec<u8> = Vec::new();
let mut chars = text.chars().peekable();
while chars.peek().is_some() {
let chunk: String = chars.by_ref().take(2).collect();
match u8::from_str_radix(&chunk, radix) {
Ok(value) => bytes.push(value),
Err(e) => return Err(format!("Unable to read input string: {}", e))
};
}
Ok(bytes)
}
pub fn radix_string(buffer: &[u8], text_format: &TextFormat) -> String {
if *text_format == TextFormat::Text {
return match str::from_utf8(buffer) {
Ok(text) => text.to_string(),
Err(_) => String::new()
};
}
let mut text = String::new();
for b in buffer {
match text_format {
TextFormat::Binary => text.push_str(format!("{:08b}", b).as_str()),
TextFormat::Octal => text.push_str(format!("{:04o}", b).as_str()),
TextFormat::Decimal => text.push_str(format!("{}", b).as_str()),
TextFormat::Hex => text.push_str(format!("{:02X}", b).as_str()),
_ => ()
};
}
text
}
pub fn print_radix_string(buffer: &[u8], text_format: &TextFormat, row_entries: &mut u32) {
let max_row_entries = match text_format {
TextFormat::Binary => 10,
TextFormat::Octal => 16,
TextFormat::Decimal => 18,
TextFormat::Hex => 20,
_ => 0
};
for b in buffer {
match text_format {
TextFormat::Binary => print!("{:#b} ", b),
TextFormat::Octal => print!("{:#o} ", b),
TextFormat::Hex => print!("0x{:02X} ", b),
_ => print!("{}", b)
};
*row_entries += 1;
if max_row_entries > 0 && *row_entries > max_row_entries {
*row_entries = 0;
println!();
}
}
}
pub fn escape_text(text: String) -> String {
let mut text = text.replace("\\r", "\r");
text = text.replace("\\n", "\n");
text = text.replace("\\t", "\t");
text
}