Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  C# kindla struktuuriga faili "salvestamine" ja loomine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
mauro
Kreisi kasutaja
mauro

liitunud: 24.04.2006



Autoriseeritud ID-kaardiga

sõnum 14.12.2010 01:01:50 C# kindla struktuuriga faili "salvestamine" ja loomine vasta tsitaadiga

Et siis tegelen hetkel natuke ühe mängu "reverse engineeringuga" - ja nüüd käsil teatud tüüpi conf faili loomiseks programmi kirjutamine. (.EFF fail).
Faili struktuur on teada jne.
Tegu ei ole teksti faili ega lihtsa config stiilis failiga, vöörtused nii teksti kui hex väärtustena decimal numbrid.

Sai esimene versioon valmis, aga mitte just kõige puhtama koodina.

Väärtused võtab textboxidest ja savefiledialog + fielstream abil faili.

Kõik byte arraysse ja siis saab faili kirjutatud.
Aga kuna failil on kindel ülesehitus, nt:
header 3 byte
string 20 byte
string 20 byte
string 20 byte
null 4 byte (et siis 00 väärtus hex, mis põhimõtteliselt ehitab ülesse struktuuri, et võõrtused oleksõiges asukohas, kui mäng seda faili loeb).

Seejärel vaja võimalust, et kui valida nupp mis lisab uue ploki, siis sama protsess aga plokk lisatakse eelneva lõppu.

Et siis vaja koodi selle jaoks puhtamaks - ehk oskab keegi pakkuda paremat lahendust sellele:



/*Eff file creator for RF Online by Mauro Tamm
* Copyrighted © 2010  http://www.gnu.org/licenses/gpl.html
* mauro.tamm@gmail.com
*/
//use nStream.Write(finalArray, 0, finalArray.Length) start index  to print each array without merging them.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace EffFileWriter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            InputToByteArray toByte = new InputToByteArray(); //create new bytearray convert object

            SaveFileDialog save = new SaveFileDialog(); //create new  dialog object
            //assign default  dialog window values
            save.Filter = ("Eff file|*.EFF");
            save.FileName = ("default");
            save.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
            save.ShowDialog();//show dialog

            FileStream nStream = (FileStream)save.OpenFile();//create new byte stream that writes to new created file

            if (save.FileName != "")//check if file name was entered
            {   
                //create new arrays from input boxes
                byte[] txt1Array = toByte.Convert(textBox1.Text.ToString());//dds1
                byte[] txt2Array = toByte.Convert(textBox2.Text.ToString());//dds2
                byte[] txt3Array = toByte.Convert(textBox3.Text.ToString());//dir
                byte[] layerArray = {byte.Parse(textBox4.Text.ToString()),byte.Parse(textBox5.Text.ToString()),byte.Parse(textBox6.Text.ToString()),byte.Parse(textBox7.Text.ToString())}; // 4 layers into array
                byte[] particleArray1 = BitConverter.GetBytes(int.Parse(textBox8.Text));//particle 1
                byte[] particleArray2 = BitConverter.GetBytes(int.Parse(textBox9.Text));//particle 2
                byte[] particleArray3 = BitConverter.GetBytes(int.Parse(textBox10.Text));//particle 3
                byte[] entiryArray = BitConverter.GetBytes(int.Parse(textBox11.Text));//entity
                byte[] nameArray = toByte.Convert(textBox12.Text.ToString());//particle name
               
                //check for missing bytes
                int txt1MissingBytes = 20 - textBox1.TextLength;
                int txt2MissingBytes = 20 - textBox2.TextLength;
                int txt3MissingBytes = 20 - textBox3.TextLength;
                int txt12MissingBytes = 20 - textBox12.TextLength;
                //create new arrays for 00 bytes
                byte[] fillNull1 = new byte[txt1MissingBytes];
                byte[] fillNull2 = new byte[txt2MissingBytes];
                byte[] fillNull3 = new byte[txt3MissingBytes];
                byte[] fillNull12 = new byte[txt12MissingBytes];
                //create header array
                byte[] header = {176,0,2};
                //00 byte arrays
                byte[] bytesX12 = {0,0,0,0,0,0,0,0,0,0,0,0};
                byte[] bytesX4 = {0,0,0,0};
                byte[] bytesX2 = {0,0};
                byte[] bytesX1 = {0};
               
                //create 00 byte arrays to compensate missing bytes
                //textbox1 - dds1
                if (textBox1.TextLength != 20)
                {
                    for (int i = 0; i < txt1MissingBytes; i++)//add values to new array
                    {
                        byte n = 0;
                        fillNull1.SetValue(n, i);
                    }
                }
                //textbox2 - dds2
                if (textBox2.TextLength != 20)
                {   
                    for (int i = 0; i < txt2MissingBytes; i++)
                    {
                        byte n = 0;
                        fillNull2.SetValue(n,i);
                    }
                }
                //textbox3 - dir
                if (textBox3.TextLength != 20)
                {
                    for (int i = 0; i < txt3MissingBytes; i++)
                    {
                        byte n = 0;
                        fillNull3.SetValue(n, i);
                    }
                }
                //textbox12 - name
                if (textBox12.TextLength != 20)
                {
                    for (int i = 0; i < txt12MissingBytes; i++)
                    {
                        byte n = 0;
                        fillNull12.SetValue(n, i);
                    }
                }
                byte[] endArray1 = new byte[63];
                byte[] endArray2 = new byte[17];
                byte[] endArray3 = new byte[48];
                byte[] endArray4 = new byte[48];

                //writes all the arrays to file.
                nStream.Write(header,0,header.Length);
                nStream.Write(txt1Array,0,txt1Array.Length);
                nStream.Write(fillNull1,0,fillNull1.Length);
                nStream.Write(txt2Array,0,txt2Array.Length);
                nStream.Write(fillNull2,0,fillNull2.Length);
                nStream.Write(txt3Array,0,txt3Array.Length);
                nStream.Write(fillNull3,0,fillNull3.Length);
                nStream.Write(bytesX2,0,bytesX2.Length);
                nStream.Write(bytesX2,0,bytesX2.Length);
                nStream.Write(bytesX1,0,bytesX1.Length);
                nStream.Write(bytesX4,0,bytesX4.Length);
                nStream.Write(bytesX4,0,bytesX4.Length);
                nStream.Write(bytesX4,0,bytesX4.Length);
                nStream.Write(layerArray,0,layerArray.Length);
                nStream.Write(bytesX12,0,bytesX12.Length);
                nStream.Write(particleArray1,0,particleArray1.Length);
                nStream.Write(bytesX12,0,bytesX12.Length);
                nStream.Write(particleArray2,0,particleArray2.Length);
                nStream.Write(bytesX12,0,bytesX12.Length);
                nStream.Write(particleArray3,0,particleArray3.Length);
                nStream.Write(bytesX12,0,bytesX12.Length);
                nStream.Write(entiryArray,0,entiryArray.Length);
                nStream.Write(bytesX4,0,bytesX4.Length);
                nStream.Write(nameArray,0,nameArray.Length);
                nStream.Write(fillNull12,0,fillNull12.Length);
                nStream.Write(bytesX4, 0, bytesX4.Length);
            }
            nStream.Close();//close the current stream
        }       
    }
}


ja InputToByteArray class:
/*Eff file creator for RF Online by Mauro Tamm
* Copyrighted © 2010  http://www.gnu.org/licenses/gpl.html
* mauro.tamm@gmail.com
*/

using System;
using System.Collections.Generic;
using System.Text;

namespace EffFileWriter
{
    class InputToByteArray
    {
        //takes string input, converts it to bytearray and returns the value.
        public byte[] Convert(string input)
        {
            ASCIIEncoding toByte = new ASCIIEncoding();
            byte[] byteArray = toByte.GetBytes(input);
            return byteArray;
        }

    }
}


Et ehk on olemas mõni võimalus mis laseks mul 00 byte arrayde käsitsi lisamisest lahti saada, ja lisaks automaatselt (nt saan lubab mõni funktsioon kirjutada andmeid faili mingi kindla offset järgi, nt alates baidist 125).
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
andreie
HV vaatleja
andreie

liitunud: 09.09.2006




sõnum 19.12.2010 21:04:12 vasta tsitaadiga

Nullide käsitsi lõppu lisamisest saad lahti abifunktsiooni abil.

Ülevaatlikum on faili struktuur kirjeldada 1:1 C# struktuuride abil. Ma kunagi tegelesin millegi sarnasega, aga päris täpselt ei oska hetkel juhendada. Ehk järgmine koodijupp aitab järjele:
[StructLayout(LayoutKind.Sequential,Pack=1)]
unsafe struct EFF_HEADER {
   public fixed byte magic[3];
   public fixed byte String1[20];
};

...


EFF_HEADER   header;
unsafe
{
   fixed (EFF_HEADER* ptr = &header)
   {
      // siin saab cast'ide vajalikku tüüpi viidaks ja faili kirjutada vms.
   }
}

jne.

_________________
Unix survives only because everyone else has done so badly.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
mauro
Kreisi kasutaja
mauro

liitunud: 24.04.2006



Autoriseeritud ID-kaardiga

sõnum 20.12.2010 06:46:27 vasta tsitaadiga

iseenesest sia nagu valmis, aga jäi iseenesest arrayde peale + arraylist.

header jah, see hea, kohe alguses... aga kui data asub nt alates byte 88-95 ja peab täpselt selles asukohas olema - pean ikka käsitisi niipalju kas 00 baite vms lisama, kuna ei tea küll ühtegi käsku mis laseks mingil kindal offsetil kirjutada ja kõik mis enne seda puudu täidaks siis nt 00 (null) vms infoga.

väiksema faili puhul kus üks blokk on mingi 176 baiti, saab jah arraysid kasutada - aga suurema puhul läheks tüütuks.


nt:

B0 00 02 54 45 53 54 5F 53 4B 49 4E 2E 44 44 53 00 00 00 0D
00 00 00 52 45 43 41 4C 4C 30 32 5F 42 2E 44 44 53 00 00 0E
00 00 00 2E 5C 5C 43 48 45 46 5C 54 45 58 5C 00 00 00 00 0C
00 00 00 00 00 01 01 00 00 00 00 00 CC CC 3D 00 CC CC 3D
00 01 01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
08 F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
AF 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
C6 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
andreie
HV vaatleja
andreie

liitunud: 09.09.2006




sõnum 21.12.2010 13:27:38 vasta tsitaadiga

mauro kirjutas:
aga kui data asub nt alates byte 88-95 ja peab täpselt selles asukohas olema - pean ikka käsitisi niipalju kas 00 baite vms lisama, kuna ei tea küll ühtegi käsku mis laseks mingil kindal offsetil kirjutada ja kõik mis enne seda puudu täidaks siis nt 00 (null) vms infoga.


Käske annavad inimesed.

Kas midagi järgmist pidasid silmas?


var nStream = new FileStream("minufail.eff", FileMode.Open); // avada fail lugemiseks ja kirjutamiseks.
nStream.Position = 88;
nStream.Write(...);

_________________
Unix survives only because everyone else has done so badly.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
mauro
Kreisi kasutaja
mauro

liitunud: 24.04.2006



Autoriseeritud ID-kaardiga

sõnum 21.12.2010 14:34:47 vasta tsitaadiga

hmm... aga juhul kui nt baite on hetkel kirjutatud nt 20 aga siis tahan kirjutada position 88 -le, kas loobib errori või täidab vahemiku ise ära? Ei saa hetkel proovida.


kood jäi hetkel muiodugi selliseks üldse, kui kellelgi mingi sarnane probleem juhtub olema:
http://www.mediafire.com/file/p4w6pv4cbxtb3oo/EffFileWriter.rar
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  C# kindla struktuuriga faili "salvestamine" ja loomine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.