Advertisement
Pheenoh

rust snippet

Sep 2nd, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.31 KB | None | 0 0
  1. use std::fs::File;
  2. use std::io::prelude::*;
  3. use std::mem;
  4. use byteorder::{BigEndian, WriteBytesExt};
  5. extern crate hex;
  6.  
  7. fn main() {
  8. let mut file = File::open("q3_cor.gci").expect("Can't open file!");
  9. let mut buffer = Vec::new();
  10.  
  11. // Read the file into vector
  12. file.read_to_end(&mut buffer)
  13. .expect("Couldn't read file.");
  14.  
  15. // Create buffers for questlogs
  16. let qlog_1_buffer = &buffer[16456..19156];
  17. let qlog_2_buffer = &buffer[19164..21864];
  18. let qlog_3_buffer = &buffer[21872..24572];
  19. let qlog_1_shadow_buffer = &buffer[24648..27348];
  20. let qlog_2_shadow_buffer = &buffer[27356..30056];
  21. let qlog_3_shadow_buffer = &buffer[30064..32764];
  22. let gci_buffer = &buffer[0..32824];
  23.  
  24. // Questlog checksums
  25. let qlog_1_checksum = &buffer[19156..19164];
  26. let qlog_2_checksum = &buffer[21864..21872];
  27. let qlog_3_checksum = &buffer[24572..24580];
  28. let qlog_1_shadow_checksum = &buffer[27348..30056];
  29. let qlog_2_shadow_checksum = &buffer[30056..32764];
  30. let qlog_3_shadow_checksum = &buffer[32764..32772];
  31.  
  32. // convert to hex for testing
  33. build_checksum(qlog_1_buffer);
  34. let test = hex::encode(qlog_1_buffer);
  35.  
  36. //println!("The bytes: {:?}", test);
  37. }
  38.  
  39. fn build_checksum(buf: &[u8]) {
  40. let mut sum: u32 = 0;
  41. let mut x: u32 = 0;
  42. let mut done = false; // mut done: bool
  43.  
  44. while !done {
  45. sum += (buf[x as usize] as u32);
  46. //println!("index: {0}, value: {1}", x, sum);
  47.  
  48. if x == ((buf.len() - 1) as u32) {
  49. done = true;
  50. }
  51. x = x + 1;
  52. }
  53.  
  54. sum = sum + (buf.len() as u32);
  55. let neg_sum: u32 = sum.wrapping_neg();
  56. println!("buf.len: {0}, total: {1}, neg_total: {2}", buf.len(), sum, neg_sum);
  57.  
  58. let mut be_sum = [0u8; mem::size_of::<u32>()];
  59. be_sum.as_mut()
  60. .write_u32::<BigEndian>(sum)
  61. .expect("Unable to write");
  62.  
  63. let mut be_neg_sum = [0u8; mem::size_of::<u32>()];
  64. be_neg_sum.as_mut()
  65. .write_u32::<BigEndian>(neg_sum)
  66. .expect("Unable to write");
  67.  
  68. for i in &be_sum {
  69. println!("{:X}", i);
  70. }
  71.  
  72. for i in &be_neg_sum {
  73. println!("{:X}", i)
  74. }
  75.  
  76. //let mut checksum: (u32, u32) = (BigEndian::from_slice_u32(&mut sum), neg_sum);
  77.  
  78. //println!("Checksum: {:?}", checksum);
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement