DLL - edycja bajtów pliku

DLL - edycja bajtów pliku
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 5 lat
  • Postów:59
0

Męcze sie drugi dzien . Czy mogłby mi ktos pomoc ?
Oto moj kod :

Kopiuj
nazwaPliku = textEditNazwaPliku.Text;
                sciezkaDoPliku = textEditSciezka.Text;
                adresHex = textEditAdresHEX.Text;
                zmianaZ = textEditZmianaZ.Text;
                zmianaNa = textEditZmianaNa.Text;
                wpis = memoEditWpisy.Text;
                 
                BinaryWriter writer = new BinaryWriter(File.Open(sciezkaDoPliku, FileMode.Open));
                
                byte[] zmianaNaByte = Encoding.ASCII.GetBytes(zmianaNa);
                try
                {

                    long adresH = Convert.ToInt64(adresHex);
                    writer.BaseStream.Position = adresH;
                    writer.Write(zmianaNaByte);
                }
                catch (Exception de)
                {
                    DXBox.pokazBlad(de.ToString());
                }
                finally
                {
                    writer.Close();
                }

Problem polega na tym ze chciałbym wpisywać adres hex w postaci 16-stkowej a nie 10-sietnej .
I kolejny problem ze mam zamienic wartosci adresu np: 3042 na 3090 a problem jest w tym ze podmienia mi ale tekstowo . Mogłby ktos pokazac jak to Zrobic ?

edytowany 2x, ostatnio: somekind
somekind
Wstawiaj kod w znaczniki.
Manuel.Artificer
Manuel.Artificer
  • Rejestracja:ponad 7 lat
  • Ostatnio:10 miesięcy
  • Postów:177
0

No więc tak jeżeli używasz klasy Encoding to ona pobiera każdy element ze stringa i zamienia go na reprezentację bajtową dla znaku (char). W tym przypadku korzysta z tablicy ASCII (tak jak zadeklarowałeś) czyli jeżeli masz stringa = "32" to 3->0x33, a 2 -> 0x32 (możesz sobie przejrzeć tablicę znaków ASCII). Stąd też podmienia Ci to tekstowo.
Co do realizacji Twojego kodu to tutaj tak na szybko napisałem jak to możesz zrobić. Być może istnieją jakieś wyspecjalizowane funkcje do tego typu operacji,ale nic nie przychodzi mi na ten moment do głowy.

Kopiuj
            long adresH = Convert.ToInt64("0x24",16); // lub long adresH = Convert.ToInt64("24",16);
          
            string zmianaNa = "0x3092";

            if (zmianaNa.Contains("0x"))
            {
                zmianaNa = new String(zmianaNa.Skip(2).ToArray());                
            }

            int bytesCount = zmianaNa.Length / 2; //każdemu bajtowi odpowiadają dwie cyfry stąd też dzielenie przez dwa żeby policzyć ile masz bajtów
            int zmianaH = Convert.ToInt32(zmianaNa, 16);

            int sizeOfType = System.Runtime.InteropServices.Marshal.SizeOf(zmianaH);//określenie ile bajtów zajmuje typ, mógłbyś mieć np. long itd., jest to potrzebne później do otrzymania końcowego wyniku, metoda GetBytes zwraca tablicę wielkości odpowiadającej wielkości przekazanego typu, jeżeli masz long to zwróci tablicę z 8 elementami, jeżeli int32 to z 4 itd.

            byte[] intBytes = BitConverter.GetBytes(zmianaH);
            if (BitConverter.IsLittleEndian)
                Array.Reverse(intBytes);
            byte[] result = intBytes.Skip(sizeOfType - bytesCount).ToArray();
edytowany 2x, ostatnio: Manuel.Artificer
NeuroXiq
"każdemu bajtowi odpowiadają dwie cyfry" - niekoniecznie, przecież mogę sobie zapisać 0xa i to jest prawidłowy zapis hex.
Manuel.Artificer
Manuel.Artificer
no tak wiem. Ja się skupiam na tym, żeby rozwiązać dany problem, a z resztą może już się pobawić zakładający wątek. W tym przypadku zrobiłem założenie, że użytkownik wprowadzi tą wartość z dwoma cyframi, no ale jak coś no to wystarczy sprawdzić czy liczba wprowadzonych cyfr jest nieparzysta, jeżeli tak to dodać na początku tego obrobionego ciągu (bez 0x) zero i jest zrobione. Ale masz rację @NeuroXiq, mogłem w komentarzu to inaczej zapisać, tak wprowadzam w pewien błąd
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 5 lat
  • Postów:59
0

Sprawdzalem i nie działa ;/
Kombinowalem i nic ;/

NeuroXiq
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 5 lat
  • Lokalizacja:Racibórz
  • Postów:101
0
Kopiuj
 static void Main(string[] args)
        {
            string nazwaPliku = "test";
            string sciezkaDoPliku = "D:\\test";
            string adresHex = "0x1a";
            string zmianaZ = "aaaa";
            string zmianaNa = "bbbb";


            int seekPosition = Convert.ToInt32(adresHex, 16); // <- pozycja w pliku
            byte[] toWrite = HexStringToByteArray(zmianaNa); //  <- co w tam wpisać

            BinaryWriter writer = new BinaryWriter(File.Open(sciezkaDoPliku, FileMode.Open));

            try
            {
                writer.Seek(seekPosition, SeekOrigin.Begin);
                writer.Write(toWrite);
            }
            catch (Exception e)
            {
            }
            finally
            {
                writer.Close();
            }
        }

        static byte[] HexStringToByteArray(string s)
        {
            string toConvert = PrepareStringToConversion(s);
            int outputLenght = toConvert.Length / 2;

            byte[] result = new byte[outputLenght];

            for (int i = 0; i < outputLenght; i++)
            {
                result[i] = Convert.ToByte(toConvert.Substring(i*2, 2), 16);
            }


            return result;
        }

        static string PrepareStringToConversion(string s)
        {
            if (s.StartsWith("0x"))
            {
                s = s.Substring(2);
            }
            if (s.Length % 2 != 0)
                s = string.Format("0{0}", s);

            return s;
        }
```

Spróbuj coś takiego i daj znać czy jest ok.

EDIT: Mój błąd - zamiast Substring(i*2, 2) było Substring(i,2)
Teraz powinno być ok
edytowany 1x, ostatnio: NeuroXiq
Manuel.Artificer
Manuel.Artificer
No powiem nawet lepsze od mojego kodu bo ja mam ograniczenie do zamiany max 8 bajtów w jednej operacji. Można by jeszcze dopisać funkcję CheckString w której by siedział regex, żeby np. nie przeszedł string np. 0xZT92, no albo dodać jeszcze obsługę takiego zapisu 00 44
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 5 lat
  • Postów:59
0

teraz jest lepiej juz . 66 8B 70 FE 83 E8 02 66 3B (34 02) 39 30 49 79 F0

Podmienia mi teraz tak : 66 8B 70 FE 83 E8 02 66 3B (30 09) 39 30 49 79 F0
Powinno zamienic na : 66 8B 70 FE 83 E8 02 66 3B (30 90) 39 30 49 79 F0

NeuroXiq
pokaż co masz w stringu 'zmiana na'
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 5 lat
  • Postów:59
0

Wiec co raz blizej rozwiazania problemu XD

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)