/* TAH Procedures*/ public void extract_TAH_directory() { Entries = null; UInt32 arc_size = (UInt32)reader.BaseStream.Length; header tah_header = new header(); byte[] magic = reader.ReadBytes(4); if (magic[0] != (byte)'T' || magic[1] != (byte)'A' || magic[2] != (byte)'H' || magic[3] != (byte)'2') { throw new Exception("File is not TAH"); } tah_header.index_entry_count = reader.ReadUInt32(); tah_header.unknown = reader.ReadUInt32(); tah_header.reserved = reader.ReadUInt32(); UInt32 index_buffer_size = tah_header.index_entry_count * 8; //sizeof(index_entry) == 8 Entries = new TAHEntry[tah_header.index_entry_count]; for (int i = 0; i < tah_header.index_entry_count; i++) { Entries[i] = new TAHEntry(); Entries[i].hash_name = reader.ReadUInt32(); Entries[i].offset = reader.ReadUInt32(); } UInt32 output_length = reader.ReadUInt32(); //entry情報の読み出し長さ UInt32 input_length = Entries[0].offset - /*sizeof(header)*/ 16 - index_buffer_size; //entry情報の読み出しバッファ byte[] data_input = new byte[input_length]; data_input = reader.ReadBytes((int)input_length); //-- entry情報の読み込み完了! -- byte[] output_data = new byte[output_length]; Decompression.decrypt(ref data_input, input_length, ref output_data, output_length); //-- entry情報の復号完了! -- build_TAHEntries(output_data, arc_size); }
public int ExtractResource(TAHEntry entry, out byte[] data_output) { //data読み込み長さ //-4はdata書き出し長さ格納領域 (UInt32) を減じている UInt32 data_input_length = entry.length - 4; //data読み込みバッファ byte[] data_input = new byte[data_input_length]; UInt32 data_output_length; reader.BaseStream.Position = entry.offset; try { //data書き出し長さ data_output_length = reader.ReadUInt32(); data_input = reader.ReadBytes((int)data_input_length); } catch (Exception) { System.Console.Out.WriteLine("Error: Cannot read out compressed data of the archive."); data_output = new byte[0]; return(-1); } //-- data読み込み(復号前)完了! -- //data書き出しバッファ data_output = new byte[data_output_length]; try { Decompression.decrypt(ref data_input, data_input_length, ref data_output, data_output_length); } catch (Exception) { System.Console.Out.WriteLine("Error: Failed to decrypt data. Possible error in archive."); return(-1); } //-- data復号完了! -- return(0); }