[C#] 'Brutalna' konwersja

1

Jak wszyscy wiemy, a czego C++owcy nie mogą zrozumieć wnioskując po niektórych artykułach, rzutowanie w C# jest rzeczą niezwykle delikatną. Nie można sobie ot tak rzutować jednego typu na drugi, jeśli nie ma relacji dziedziczenia to trzeba zdefiniować odpowiedni operator.

I tutaj właśnie mam pewien problem. Mam kilka struktur, bez funkcji, dla uproszczenia ze zmiennymi publicznymi a nie właściwościami (wiem że to lamerskie, ale wolę mieć 30 publicznych zmiennych niż 30 prywatnych i 60 funkcji).

Jest może jakaś możliwość aby rzutować byte[] na te struktury? Bo niezbyt mi się uśmiecha pisanie konwerterów...

1

Hmm, wygląda na to że sobie jakoś poradziłem :]

Oryginał by Lars Wilhelmsen

        public static object RawDeserialize(byte[] rawData, int position, Type anyType)
        {
            int rawsize = Marshal.SizeOf(anyType);
            if (rawsize > rawData.Length)
                return null;
            IntPtr buffer = Marshal.AllocHGlobal(rawsize);
            Marshal.Copy(rawData, position, buffer, rawsize);
            object retobj = Marshal.PtrToStructure(buffer, anyType);
            Marshal.FreeHGlobal(buffer);
            return retobj;
        }
0

Można spytać po co to robisz?

1

Ogólnie to skomplikowanie :]

Piszę bibliotekę do podstawowej obsługi plików PE, i siłą rzeczy muszę przechowywać masę informacji z samych nagłówków. I teraz muszę wczytać z pliku na dysku - czyli bajty - te struktury.
Można to zrobić i za pomocą operatorów konwersji, ale to będą pewnie SETKI linijek - wydaje mi się że raczej mniej czytelnych.

Reasumując, może i to lamerskie, ale jakie wygodne...

0

Często robi się to podczas wysyłania struktur przez sieć do innego hosta, w ten sposób tworzy się obiektową obudowę połączenia (każdy pakiet to struktura).

Ja to zrobiłem właśnie poprzez konwertery, tzn każdy pakiet wychodzący musiał dziedziczyć po PacketOut, który wymuszał funkcję zamiany na tablicę bajtów oraz pakiet przychodzący PacketIn miał funkcję wypełniającą strukturę za pomocą otrzymanej tablicy bajtów (np. z socketa).

Generalnie metoda którą podałeś jest znana ale problematyczna w tym sensie, że stringi nie będą ładnie czytane (musisz ustawiać atrybuty dla Stringów, wg. których są zamieniane na bajty (bodajże jest coś takiego jak byteCount, czyli najmniejsza ilość bajtów na string, zatem np. na string 3 literowy trzeba 128 bajtów, co nie ma wiekszego sensu).

Radzę pisać konwertery.

0

MSM - w twoim rozwiązaniu - o ile mnie pamięć nie myli - będzie problem z polami typu string. Polecam przetestować.

0

Jest to dziedzina w której C# jest najbardziej niedorobiony. Twórcy .Net tak się zapędzili w abstrakcji, że widać zapomnieli że dobranie się do poszczególnych bajtów struktury jest jednak potrzebne...

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