magic number and impossible out of bound for tree and char

This commit is contained in:
2025-04-11 11:02:10 +02:00
parent 54ef28b037
commit 16f1cd067b

View File

@@ -10,6 +10,8 @@ mod node;
use byte_writer::{binary_to_string, string_to_binary};
use node::{Node, create_tree, read_tree, tree_to_map, tree_to_string};
const MAGIC_NUMBER: u8 = 128;
fn main() -> std::io::Result<()> {
let args: Vec<String> = env::args().collect();
@@ -36,9 +38,9 @@ fn main() -> std::io::Result<()> {
let binary = string_to_binary(&str_bin);
let len_tree: u32 = str_bin.len() as u32;
let string: String = chars.iter().collect();
after_compression
.write_all(&(len_tree + (string.len() as u32) * 8).to_be_bytes())?;
after_compression.write_all(&MAGIC_NUMBER.to_be_bytes())?;
after_compression.write_all(&len_tree.to_be_bytes())?;
after_compression.write_all(&(string.len() as u32).to_be_bytes())?;
after_compression.write_all(&binary)?;
after_compression.write_all(string.as_bytes())?;
to_compress.seek(SeekFrom::Start(0))?;
@@ -59,9 +61,18 @@ fn main() -> std::io::Result<()> {
match file_name {
Some(f) => {
let mut to_print = File::open(f)?;
let mut mag_buf = [0u8];
let _ = to_print.read_exact(&mut mag_buf);
match u8::from_be_bytes(mag_buf) {
128 => {
let untranslate = string_translate(&mut to_print);
eprintln!("untranslate = {}", untranslate);
}
_ => {
println!("Error oppening file, check type file !")
}
}
}
None => {
println!("No file name!");
display_options();
@@ -118,22 +129,16 @@ fn get_map_file(mut file: &File) -> Result<HashMap<char, i32>, std::io::Error> {
fn string_translate(file: &mut File) -> String {
let mut buffer = [0u8; 4];
let _ = file.read_exact(&mut buffer);
let len_head = u32::from_be_bytes(buffer);
let _ = file.read_exact(&mut buffer);
let len_tree = u32::from_be_bytes(buffer);
//eprintln!("len_head = {:?}", len_head);
//eprintln!("len_tree = {:?}", len_tree);
let _ = file.read_exact(&mut buffer);
let len_chars = u32::from_be_bytes(buffer) * 8;
let len_chars = len_head - len_tree;
let tree_bin = read_n_bytes(file, len_tree);
let tree_str = binary_to_string(tree_bin, len_tree);
//eprintln!("tree_str = {:?}", tree_str);
let chars_bin = read_n_bytes(file, len_chars);
let chars_str = String::from_utf8(chars_bin).unwrap();
let root = read_tree(&tree_str, &chars_str.chars().collect());
//let map = tree_to_map(&mut root, true);
//eprintln!("map = {:?}", map);
let _ = file.read_exact(&mut buffer);
let len_body = u32::from_be_bytes(buffer);
translate_bin_char(file, root, len_body)