private void openABToolStripMenuItem1_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog { Filter = "AB File (*.AB)|*.AB" }; if (dialog.ShowDialog() != DialogResult.Cancel) { ABList.Items.Clear(); BinaryReader fp = new BinaryReader(dialog.OpenFile()); string str = Encoding.UTF8.GetString(fp.ReadBytes(2)); Ab = new List <AB_s>(); if (str == "AB") { AB_s ab = new AB_s(); ab = LoadAb(fp, ab); Ab.Add(ab); } } }
public static AB_s LoadAb(BinaryReader fp, AB_s Ab) { fp.BaseStream.Seek(0L, SeekOrigin.Begin); int num = 0; fp.ReadInt16(); Ab.Block_Num = fp.ReadInt16(); Ab.BlockStartOff = new ArrayList(); for (num = 0; num <= Ab.Block_Num; num++) { uint num2 = fp.ReadUInt32(); Ab.BlockStartOff.Add(num2); } Ab.BlockData = new List <ClosableMemoryStream>(); Ab.BlockInfo = new List <BlockInfo_s>(); num = 0; for (num = 0; num < Ab.Block_Num; num++) { ClosableMemoryStream output = new ClosableMemoryStream(); byte[] buffer = new byte[((uint)Ab.BlockStartOff[num + 1]) - ((uint)Ab.BlockStartOff[num])]; fp.Read(buffer, 0, buffer.Length); new BinaryWriter(output).Write(buffer); Ab.BlockData.Add(output); BlockInfo_s item = new BlockInfo_s(); BinaryReader reader = new BinaryReader(Ab.BlockData[num]); reader.BaseStream.Seek(0x13L, SeekOrigin.Begin); item.File_Num = reader.ReadByte(); item.FileOff = new ArrayList(); int num3 = 0; while (num3 < item.File_Num) { uint num4 = reader.ReadUInt32(); item.FileOff.Add(num4); num3++; } item.FileData = new List <ClosableMemoryStream>(); reader.ReadInt32(); if (item.File_Num == 0) { ClosableMemoryStream stream2 = Ab.BlockData[num]; item.FileData.Add(stream2); } else { for (num3 = 0; num3 < item.File_Num; num3++) { ClosableMemoryStream stream3 = new ClosableMemoryStream(); byte[] buffer2 = new byte[0]; if (num3 == (item.File_Num - 1)) { buffer2 = new byte[((uint)Ab.BlockData[num].Length) - ((uint)item.FileOff[num3])]; } else { buffer2 = new byte[((uint)item.FileOff[num3 + 1]) - ((uint)item.FileOff[num3])]; } reader.Read(buffer, 0, buffer.Length); new BinaryWriter(stream3).Write(buffer); item.FileData.Add(stream3); } } Ab.BlockInfo.Add(item); } return(Ab); }