From 5bc061be5f5994907b522268b6c5a3ba85a7c9f3 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 25 May 2021 11:22:22 -0400 Subject: [PATCH] show crc32 for some pieces of .bin and .dat data in quest info display --- psogc_quest_tool/Cargo.toml | 1 + psogc_quest_tool/src/info.rs | 71 ++++++++++++++++++++++------------- psogc_quest_tool/src/lib.rs | 1 + psogc_quest_tool/src/utils.rs | 7 ++++ 4 files changed, 53 insertions(+), 27 deletions(-) create mode 100644 psogc_quest_tool/src/utils.rs diff --git a/psogc_quest_tool/Cargo.toml b/psogc_quest_tool/Cargo.toml index 2a6ed7b..893b98e 100644 --- a/psogc_quest_tool/Cargo.toml +++ b/psogc_quest_tool/Cargo.toml @@ -8,6 +8,7 @@ edition = "2018" [dependencies] anyhow = "1.0.40" +crc = "1.8.1" [dependencies.psoutils] path = "../psoutils" \ No newline at end of file diff --git a/psogc_quest_tool/src/info.rs b/psogc_quest_tool/src/info.rs index d0c8c53..4c98a87 100644 --- a/psogc_quest_tool/src/info.rs +++ b/psogc_quest_tool/src/info.rs @@ -6,6 +6,8 @@ use psoutils::quest::bin::QuestBin; use psoutils::quest::dat::{QuestDat, QuestDatTableType}; use psoutils::quest::Quest; +use crate::utils::crc32; + fn format_description_field(description: &String) -> String { description .trim() @@ -13,13 +15,21 @@ fn format_description_field(description: &String) -> String { } fn display_quest_bin_info(bin: &QuestBin) { + let object_code_crc32 = crc32(bin.object_code.as_ref()); + let function_offset_table_crc32 = crc32(bin.function_offset_table.as_ref()); + println!("QUEST .BIN FILE"); println!("======================================================================"); println!("name: {}", bin.header.name); - println!("object_code size: {}", bin.object_code.len()); println!( - "function_offset_table size: {}", - bin.function_offset_table.len() + "object_code: size: {}, crc32: {:08x}", + bin.object_code.len(), + object_code_crc32 + ); + println!( + "function_offset_table: size: {}, crc32: {:08x}", + bin.function_offset_table.len(), + function_offset_table_crc32 ); println!("is_download: {}", bin.header.is_download); println!( @@ -46,58 +56,65 @@ fn display_quest_bin_info(bin: &QuestBin) { fn display_quest_dat_info(dat: &QuestDat, episode: u32) { println!("QUEST .DAT FILE"); - println!("======================================================================"); + println!("================================================================================"); for (index, table) in dat.tables.iter().enumerate() { let body_size = table.bytes.len(); + let body_crc32 = crc32(table.bytes.as_ref()); + match table.table_type() { QuestDatTableType::Object => { let num_entities = body_size / 68; println!( - "{:3} {:5} {:<21} {:30} {:5}", + "{:3} {:5} {:<21} {:30} {:5} {:08x}", index, body_size, table.table_type().to_string(), table.area_name(episode).to_string(), - num_entities + num_entities, + body_crc32 ); } QuestDatTableType::NPC => { let num_entities = body_size / 72; println!( - "{:3} {:5} {:<21} {:30} {:5}", + "{:3} {:5} {:<21} {:30} {:5} {:08x}", index, body_size, table.table_type().to_string(), table.area_name(episode).to_string(), - num_entities + num_entities, + body_crc32 ); } QuestDatTableType::Wave => { println!( - "{:3} {:5} {:<21} {:30}", - index, - body_size, - table.table_type().to_string(), - table.area_name(episode).to_string() - ); - } - QuestDatTableType::ChallengeModeSpawns => { - println!( - "{:3} {:5} {:<21} {:30}", - index, - body_size, - table.table_type().to_string(), - table.area_name(episode).to_string() - ); - } - QuestDatTableType::ChallengeModeUnknown => { - println!( - "{:3} {:5} {:<21} {:30}", + "{:3} {:5} {:<21} {:30} {:08x}", index, body_size, table.table_type().to_string(), table.area_name(episode).to_string(), + body_crc32 + ); + } + QuestDatTableType::ChallengeModeSpawns => { + println!( + "{:3} {:5} {:<21} {:30} {:08x}", + index, + body_size, + table.table_type().to_string(), + table.area_name(episode).to_string(), + body_crc32 + ); + } + QuestDatTableType::ChallengeModeUnknown => { + println!( + "{:3} {:5} {:<21} {:30} {:08x}", + index, + body_size, + table.table_type().to_string(), + table.area_name(episode).to_string(), + body_crc32 ); } QuestDatTableType::Unknown(n) => { diff --git a/psogc_quest_tool/src/lib.rs b/psogc_quest_tool/src/lib.rs index c1144e3..0b357c0 100644 --- a/psogc_quest_tool/src/lib.rs +++ b/psogc_quest_tool/src/lib.rs @@ -1,2 +1,3 @@ pub mod convert; pub mod info; +mod utils; diff --git a/psogc_quest_tool/src/utils.rs b/psogc_quest_tool/src/utils.rs new file mode 100644 index 0000000..1cb3b92 --- /dev/null +++ b/psogc_quest_tool/src/utils.rs @@ -0,0 +1,7 @@ +use crc::{crc32, Hasher32}; + +pub fn crc32(bytes: &[u8]) -> u32 { + let mut digest = crc32::Digest::new(crc32::IEEE); + digest.write(bytes); + digest.sum32() +}