public override object[] GetStructures() { object[] Res = new object[0]; int SizeOfTextHeader = Marshal.SizeOf(typeof(MuDef.MUFile_TextItemHead)); int SizeOfTextBody = Marshal.SizeOf(typeof(MuDef.MUFile_Text)); m_FileBuffer = new byte[SizeOfTextBody]; try { //read BMD head m_FileStream.Read(m_FileBuffer, 0, Marshal.SizeOf(typeof(MuDef.TBmdHead))); object objBmdHeader = Marshal.PtrToStructure( Marshal.UnsafeAddrOfPinnedArrayElement(m_FileBuffer, 0), typeof(MuDef.TBmdHead)); MuDef.TBmdHead BmdHead = (MuDef.TBmdHead)objBmdHeader; //initialize Res Res = new object[BmdHead.LineCount]; MuDef.MUFile_TextItemHead TextHead; MuDef.MUFile_TextManaged TextObj; for (int i = 0; i < BmdHead.LineCount; i++) { m_FileStream.Read(m_FileBuffer, 0, SizeOfTextHeader); object objItemHeader = Marshal.PtrToStructure( Marshal.UnsafeAddrOfPinnedArrayElement(m_FileBuffer, 0), typeof(MuDef.MUFile_TextItemHead)); TextHead = (MuDef.MUFile_TextItemHead)objItemHeader; m_FileStream.Read(m_FileBuffer, 0, TextHead.LineLen); XorFilter(ref m_FileBuffer, TextHead.LineLen); string Tmp = ASCIIEncoding.ASCII.GetString(m_FileBuffer, 0, TextHead.LineLen); TextObj = new MuDef.MUFile_TextManaged() { LineNr = TextHead.LineNr, Text = Tmp }; Res[i] = TextObj; } } //todo: prevent catch (IndexOutOfRangeException) { } catch (Exception) { MessageBox.Show("Failed to read file structures."); } CloseSourceFile(); return(Res); }
public override void SaveAsBmd(string OutputPath, DataGridView dgv) { try { int FilledRowCount = dgv.Rows.Count - 1; FileStream OutputStream = File.Open(OutputPath, FileMode.Create, FileAccess.Write); MuDef.TBmdHead BmdHeader = new MuDef.TBmdHead() { Version = MuDef.cBmdVersion, LineCount = FilledRowCount }; MuDef.MUFile_TextItemHead TextItemHeader; //write bmd header int nBmdHeaderSize = Marshal.SizeOf(typeof(MuDef.TBmdHead)); int nTextHeaderSize = Marshal.SizeOf(typeof(MuDef.MUFile_TextItemHead)); OutputStream.Write(StructureToByteArray(BmdHeader), 0, nBmdHeaderSize); //write text header for (int i = 0; i < FilledRowCount; i++) { TextItemHeader = new MuDef.MUFile_TextItemHead() { LineNr = int.Parse(dgv.Rows[i].Cells[0].Value.ToString()), LineLen = dgv.Rows[i].Cells[1].Value.ToString().Length }; OutputStream.Write(StructureToByteArray(TextItemHeader), 0, nTextHeaderSize); if (TextItemHeader.LineLen > 0) { byte[] text_bytes = ASCIIEncoding.ASCII.GetBytes(dgv.Rows[i].Cells[1].Value.ToString()); XorFilter(ref text_bytes, text_bytes.Length); OutputStream.Write(text_bytes, 0, TextItemHeader.LineLen); } } OutputStream.Flush(); OutputStream.Close(); } catch { MessageBox.Show("Failed to save file."); } }