C# początki :)

0

Witam wszystkich,jakiś czas temu życie zmusiło mnie do postawienia pierwszych kroków w napisaniu kilku linijek kodu,wtedy wybór padł na Pythona.Głównie wykonuje operacje na plikach binarnych,wyszukanie danego ciągu bajtów oraz podmiana tego ciągu.Tam wszystko opierało się do napisania kilku linijek kodu:
wczytaj plik.bin,podmień 48 FF FF 01 na 48 FF FF 00 i zapisz plik-mod.bin
Jako ze głównie potrzebuje przeprowadzać operacje na plikach,to proszę was o polecenie mi jakiegoś tutorialu bądź książki która mi pomoże w tych zadaniach.
edit:
teraz dopiero zauważyłem ze zjadło literkę

2

Przestrzeń nazw System.IO. Tam są klasy w rodzaju File - do łatwych operacji na całych plikach, zestaw strumieni do zapisywania danych binarnie/tekstowo, klasy FileInfo i DirectoryInfo do pracy z obiektami systemu plików, i wiele innych.

0

Oki zapoznam się z materiałem,można gdzieś zobaczyć jakieś przykłady na plikach binarnych??Dzięki za odpowiedź

1

Gdzieś? Wszędzie. Wystarczy poszukać. Tutaj pierwszy z brzegu przykład:

http://www.tutorialspoint.com/csharp/csharp_binary_files.htm

Nie weryfikowałem.

0

dzięki za przykład,żeby szukać muszę wiedzieć czego mam szukać :),jestem tu nowy wiec pytam i to chyba w odpowiednim dziale, na razie
ćwiczę pisanie prostych programów z tutoriali na youtube,bo na operacje z plikami jest dla mnie za wcześnie(nie kumam tego)
pozd
maax

0

Witam ponownie,poradziłem sobie w zasadzie z wszystkim,pozostała jedna sprawa której nie mogę zrobić.Plik tekstowy załadowałem do zmiennej 'text'(tak mam łatwiej bo robię na nim wiecej operacji) i teraz potrzebuje zamienić znaki za ciągiem liter które znam,tak to wygląda:
te_litery_znam_xxxxx , gdzie x jest mi nie znana,a muszę to podmienić.
Siedzę już nad tym trochę czasu a dalej nie rozwiązałem tego problemu,proszę ponownie o pomoc.
pozd.
maax

1
		var text = "te_litery_znam_xxxxx_podmieniam tylko x tego nie ruszam";
		var newText = Regex.Replace(text,"znam_.{5}","znam_ABCDE");
		Console.WriteLine(newText);
0

dzięki za podpowiedź,ale mam z tym problem,robię to na takim przykładzie:
cały plik mam zapisany do string hex;
w nim jest wiele znaków ale ja znam tylko trochę
robiąc to na przykładzie kolegi,wygląda to tak:
var hex = "0101000C3B0D03";
var hex2 = Regex.Replace(hex, "0101000C3B0D03.{2}", "0101000C3B0D0302");
MessageBox.Show(hex2);
pierwsza linijka to wartość szukana,w drugiej lini każemy programowi zamienić po 03 dwa znaki,ale jak to wykonuje program się wykłada z napisem ze index wykracza poza granice tabeli,jesli dam zapisz plik zostaje zapisany tak:0101000C3B0D03
Teraz sa dwa wyjścia albo ja coś robię źle albo źle to wytłumaczyłem bo pliki maja różną zawartość oraz ilość tekstu,cecha wspólna jest ten ciąg 0101000C3B0D03 , zawsze będę chciał zamieniać kilka liter bądź cyfr po tym ciągu,ale chciałbym żeby to podmieniało tylko zdefiniowanych kilka znaków,i nie obcinało znaków które będą zaraz za znakami które podmieniam.

0

To co masz teraz pod hex to jest prawdziwa wartość?
Bo to jest za krótkie.

0

tak to jest wartość prawdziwa która znam,jest ona umiejscowiona gdzieś w środku pliku tekstowego,w każdym pliku taka sama,za ta wartością jest zawsze kilka znaków które muszę podmienić a ich nie znam

1

Pod hex ma być zawartość twojego pliku tekstowego.

 
                var hex = File.ReadAllText("c:/myFile.txt");
                var hex2 = Regex.Replace(hex, "0101000C3B0D03.{2}", "0101000C3B0D0302");
                MessageBox.Show(hex2);
0

pierwsza linia var hex = File.ReadAllText("c:/myFile.txt"); nie jest mi potrzebna,bo dopisałem wcześniej plik do zmiennej,nie wiem czemu mi to wcześniej nie działało,widać mały skill :)
Dziękuje ci kolego za pomoc.
pozdrawiam

0

dziala dziekuje kolego

0

Witam ponownie,jako ze operacje na stringach już mam poćwiczone mam pytanie o plik binarny.W pliku mam kilkadziesiąt bajtów,znam kilka bajtów 16 9F 16 9F ,czy da się przeprowadzić operacje na pliku binarnym,bez konwersji do stringa żeby wyszukać ten ciąg bajtów podać adres pierwszego bajta za tym wyszukanym ciągiem i wyzerować te miejsce 00 ?

0

Google nie działają?

File.ReadAllBytes
File.WriteAllBytes

0

nie wiem po co te złośliwe pytanie,nubek się zapytał wiec trzeba sobie pojeździć po nim?Odczyt pliku już dawno mam (zapisałem go do zmiennej buffer)bardziej chodzi mi o mechanizm wyszukiwania bajtów oraz samej podmiany,w przypadku kiedy znam kilka bajtów przed.

2

Nie chodzi o to, aby po kimś pojeździć, ale jedną z najważniejszych umiejętnością programisty jest szukanie informacji - czy to w googlu, czy na SO
Po wpisaniu w googla
C# byte search sequence
wyskakuje

http://stackoverflow.com/questions/283456/byte-array-pattern-search

a tam masz
http://stackoverflow.com/a/283648/5381370

using System;
using System.Collections.Generic;

static class ByteArrayRocks {

    static readonly int [] Empty = new int [0];

    public static int [] Locate (this byte [] self, byte [] candidate)
    {
        if (IsEmptyLocate (self, candidate))
            return Empty;

        var list = new List<int> ();

        for (int i = 0; i < self.Length; i++) {
            if (!IsMatch (self, i, candidate))
                continue;

            list.Add (i);
        }

        return list.Count == 0 ? Empty : list.ToArray ();
    }

    static bool IsMatch (byte [] array, int position, byte [] candidate)
    {
        if (candidate.Length > (array.Length - position))
            return false;

        for (int i = 0; i < candidate.Length; i++)
            if (array [position + i] != candidate [i])
                return false;

        return true;
    }

    static bool IsEmptyLocate (byte [] array, byte [] candidate)
    {
        return array == null
            || candidate == null
            || array.Length == 0
            || candidate.Length == 0
            || candidate.Length > array.Length;
    }

    static void Main ()
    {
        var data = new byte [] { 23, 36, 43, 76, 125, 56, 34, 234, 12, 3, 5, 76, 8, 0, 6, 125, 234, 56, 211, 122, 22, 4, 7, 89, 76, 64, 12, 3, 5, 76, 8, 0, 6, 125 };
        var pattern = new byte [] { 12, 3, 5, 76, 8, 0, 6, 125 };

        foreach (var position in data.Locate (pattern))
            Console.WriteLine (position);
    }
}

A samą podmianę można zrobić na kilka sposobów

 
   static void Main()
    {
        var data = new byte[] { 23, 36, 43, 76, 125, 56, 34, 234, 12, 3, 5, 76, 8, 0, 6, 125, 234, 56, 211, 122, 22, 4, 7};
        var pattern = new byte[] { 12, 3, 5, 76, 8, 0, 6, 125 };

        DrawByteCollection(data);

        Byte b = new byte();
        b = Byte.Parse("0");
        data.SetValue(b,4);

        DrawByteCollection(data);

        data[4] = 0x1;

        DrawByteCollection(data);
    }

    static void DrawByteCollection(byte[] data)
    {
        foreach (var b in data)
        {
            Console.Write(b + " ");
        }
        Console.WriteLine();
    }
0

Twój przykład działa dobrze(dzięki za przykład),w momencie kiedy wiem ze potrzebuje podmienić 4 bajt,ja natomiast potrzebuje podmienić jeden bajt,za bajtami które znam,bo nie zawsze mam to co chce zmienić w tym samym miejscu,wiec przypisanie bajtu zmaiany na stałe nic mi nie da.Zawsze mam ten sam ciąg bajtów po których muszę coś podmienić,czasem tylko podmieniam jeden bajt a czasem więcej,przykład prostego pliku który zrobiłem na potrzeby testu(taka jest zawartość bajtów w pliku): { 117, 115, 101, 114, 95, 109, 97, 114, 101, 64 },znam np {109,97} i potrzebuje zmienić bajty { 117, 115, 101, 114, 95, 109, 97, 0, 101, 64 } lub czasem { 117, 115, 101, 114, 95, 109, 97, 0, 0, 0 }.Operuje na większych plikach 512-4096Kb,ale na potrzeby testu ten mały będzie dobry.
Stosując twoje rozwiązanie napisałem takie coś:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string path;
        byte[] buffer;
        private void button1_Click(object sender, EventArgs e) //open
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {

                path = ofd.FileName;
            }
            BinaryReader br = new BinaryReader(File.OpenRead(path));
            int length = (int)br.BaseStream.Length;
            buffer = br.ReadBytes(length); 




            Byte b = new byte();
            b = Byte.Parse("00");
            buffer.SetValue(b, 4);


        }

        private void button2_Click(object sender, EventArgs e) //save
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "Binary|*.bin";
            sfd.FileName = "mod";
            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string path = sfd.FileName;
                BinaryWriter bw = new BinaryWriter(File.OpenWrite(path));

                bw.Write(buffer);
                bw.Dispose(); 
1
  1. Formatuj tekst - nie kod, tylko tekst w poście. Spacja czy tabulator może zmienić strumień świadomości w tekst, który można od razu ogarnąć.
  2. Zamiast tej 4 możesz tam dać wynik funkcji Locate (piszę z palca, mogą być błędy)
  3. Jak kogoś chcesz docenić, to możesz kliknąć w tę łapkę po prawej posta :P
foreach(int position in buffer.Locate(  new byte [] { 117, 115, 101, 114, 95, 109, 97, 0, 101, 64 } )
{
    buffer.SetValue(b, /*Twoja pozycja*/ position + offset);

}
0

Chyba zawsze daje łapkę jak ktoś mi pomaga,mam jakiś błąd z funkcja Locate,podświetla mi ja na czerwono (:.Od razu mówię że nie chce być jakimś tam programistą,po prostu chcę sobie ułatwić pracę którą wykonuje na co dzień,dosyć łatwo mi poszło z operacjami na plikach tekstowych,ale z binarnymi będzie problem,jest mało materiałów w naszym języku,a ze jestem osobą starszą i w szkole był tylko język naszych przyjaciół,to szukanie czegoś na stronach angielskich,przychodzi mi z pewnymi trudnościami.

0

wiem wiem i dziękuję ci ponownie za to,ale połączenie tego co ty napisałeś w tych 2 postach i dodanie do mojego programu po prostu przewyższa mojego skilla,potrenuje to w tygodniu,ale myślę że będę musiał sporo poczytać zanim mi to wyjdzie.W kazdym bądź razie wielkie dzięki za zainteresowanie tym problemem

1 użytkowników online, w tym zalogowanych: 0, gości: 1