public override void SaveAsBmd(string OutputPath, DataGridView dgv) { try { int FilledRowCount = dgv.Rows.Count - 1; FileStream OutputStream = File.Open(OutputPath, FileMode.Create, FileAccess.Write); List <MuDef.MUFile_GenericFilter> TmpList = new List <MuDef.MUFile_GenericFilter>(dgv.Rows.Count); MuDef.MUFile_GenericFilter CurrentItem = new MuDef.MUFile_GenericFilter(); for (int i = 0; i < FilledRowCount; i++) { CurrentItem.Text = dgv.Rows[i].Cells[0].Value.ToString(); TmpList.Add(CurrentItem); } int ItemSize = Marshal.SizeOf(typeof(MuDef.MUFile_GenericFilter)); int TotalSize = ItemSize * cTotalStructCount; byte[] FileBuffer = new byte[TotalSize + 1]; //write for (int i = 0; i < FilledRowCount; i++) { byte[] buf = StructureToByteArray(TmpList[i]); XorFilter(ref buf, Marshal.SizeOf(typeof(MuDef.MUFile_GenericFilter))); buf.CopyTo(FileBuffer, i * ItemSize); } OutputStream.Write(FileBuffer, 0, TotalSize); byte[] crc_bytes = BitConverter.GetBytes(GetCRC(FileBuffer, TotalSize)); OutputStream.Write(crc_bytes, 0, sizeof(int)); OutputStream.Flush(); OutputStream.Close(); } catch { MessageBox.Show("Failed to save file"); } }
public override object[] GetStructures() { object[] Res = new object[cTotalStructCount]; int SizeOfItem = Marshal.SizeOf(typeof(MuDef.MUFile_GenericFilter)); MuDef.MUFile_GenericFilter CurrentItem = new MuDef.MUFile_GenericFilter(); m_FileBuffer = new byte[SizeOfItem * cTotalStructCount]; try { while ((m_FileStream.Read(m_FileBuffer, SizeOfItem * m_CurrentLine, SizeOfItem)) == SizeOfItem) { object Item = Marshal.PtrToStructure( Marshal.UnsafeAddrOfPinnedArrayElement(m_FileBuffer, SizeOfItem * m_CurrentLine++), typeof(MuDef.MUFile_GenericFilter)); XorFilter(ref Item); CurrentItem = (MuDef.MUFile_GenericFilter)Item; Res[m_CurrentLine] = (object)CurrentItem; } } //todo: prevent catch (IndexOutOfRangeException) { } catch (Exception) { MessageBox.Show("Failed to read file structures."); } CloseSourceFile(); return(Res); }