From 66bebb36935009ab026fe1c5ec6422a39257fcd6 Mon Sep 17 00:00:00 2001 From: jpk Date: Thu, 15 Dec 2022 11:10:05 +0100 Subject: [PATCH] Support length to read --- src/main.rs | 5 ++++- src/tohex.rs | 15 +++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index c898e9e..7958a99 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,9 @@ struct Arguments { /// Revert a hexdump to binary #[arg(short, long)] revert: bool, + /// Stop after octets + #[arg(short, long)] + length: Option, /// Filename to read, if left out read from stdin filename: Option, @@ -32,7 +35,7 @@ fn main() { }; if !args.revert { - hexdump(reader); + hexdump(reader, args.length.unwrap()); } else { let writer: Box = Box::new(io::stdout()); bindump(reader, writer); diff --git a/src/tohex.rs b/src/tohex.rs index cc3f06f..96cbeb2 100644 --- a/src/tohex.rs +++ b/src/tohex.rs @@ -24,22 +24,29 @@ fn dump_to_chr(bytes: &mut [u8]) -> String { out_vec.join("") } -pub fn hexdump(mut reader: Box) { +pub fn hexdump(mut reader: Box, length: usize) { let mut buf = [0; GLOBAL_BUFFER_LENGTH]; let mut offset: usize = 0; + let mut bytes_left = length; loop { let bytes_read = reader.read(&mut buf); match bytes_read { Ok(num) => { - if num == 0 { + let mut to_read = num; + if num > bytes_left { + to_read = bytes_left; + } + bytes_left -= to_read; + + if to_read == 0 { break; } else { println!( "{:08x}: {:40} {:10}", offset, - dump_to_hex(&mut buf[0..num]), - dump_to_chr(&mut buf[0..num]) + dump_to_hex(&mut buf[0..to_read]), + dump_to_chr(&mut buf[0..to_read]) ); offset += GLOBAL_BUFFER_LENGTH; }