DLL - edycja bajtów pliku

0

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

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 ?

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.

            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();
0

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

0
 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
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

0

Wiec co raz blizej rozwiazania problemu XD

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