praegune kellaaeg 18.06.2025 17:30:53
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
mauro
Kreisi kasutaja

liitunud: 24.04.2006
|
14.12.2010 01:01:50
C# kindla struktuuriga faili "salvestamine" ja loomine |
|
|
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 |
|
 |
andreie
HV vaatleja

liitunud: 09.09.2006
|
19.12.2010 21:04:12
|
|
|
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 |
|
 |
mauro
Kreisi kasutaja

liitunud: 24.04.2006
|
20.12.2010 06:46:27
|
|
|
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 |
|
 |
andreie
HV vaatleja

liitunud: 09.09.2006
|
21.12.2010 13:27:38
|
|
|
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 |
|
 |
mauro
Kreisi kasutaja

liitunud: 24.04.2006
|
21.12.2010 14:34:47
|
|
|
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 |
|
 |
|
lisa lemmikuks |
|
|
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.
|