eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingPakowanie strukturRe: Pakowanie struktur
  • X-Received: by 10.140.92.120 with SMTP id a111mr226546qge.8.1449161760776; Thu, 03
    Dec 2015 08:56:00 -0800 (PST)
    X-Received: by 10.140.92.120 with SMTP id a111mr226546qge.8.1449161760776; Thu, 03
    Dec 2015 08:56:00 -0800 (PST)
    Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask
    .pl!news.nask.org.pl!news.unit0.net!news.glorb.com!b51no6176603qgf.0!news-out.g
    oogle.com!z49ni44920qgd.1!nntp.google.com!f78no6175704qge.1!postnews.google.com
    !glegroupsg2000goo.googlegroups.com!not-for-mail
    Newsgroups: pl.comp.programming
    Date: Thu, 3 Dec 2015 08:56:00 -0800 (PST)
    In-Reply-To: <9...@g...com>
    Complaints-To: g...@g...com
    Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=159.205.154.116;
    posting-account=xjvq9QoAAAATMPC2X3btlHd_LkaJo_rj
    NNTP-Posting-Host: 159.205.154.116
    References: <n3n4m5$grf$1@node1.news.atman.pl>
    <2...@g...com>
    <7...@g...com>
    <9...@g...com>
    User-Agent: G2/1.0
    MIME-Version: 1.0
    Message-ID: <f...@g...com>
    Subject: Re: Pakowanie struktur
    From: "M.M." <m...@g...com>
    Injection-Date: Thu, 03 Dec 2015 16:56:00 +0000
    Content-Type: text/plain; charset=ISO-8859-2
    Content-Transfer-Encoding: quoted-printable
    Xref: news-archive.icm.edu.pl pl.comp.programming:208941
    [ ukryj nagłówki ]

    On Thursday, December 3, 2015 at 5:29:03 PM UTC+1, Maciej Sobczak wrote:
    > > Jakie triki? W ogóle nie można rozpoznać na podstawie samych
    > > danych w jakim formacie są zakodowane.
    >
    > Przecież nikt nie każe rozpoznawać formatu na podstawie danych. O ile zrozumiałem
    nawiązanie do protokołów sieciowych, to format jest zwykle znany z góry.
    Jeśli przyszły dane w formacie znanym na podstawie protokołu, to trzeba
    napisać konwersję zgodną z danym formatem. Rozmowa, w kontekście znanego
    protokołu, zarówno o kopiowaniu bit po bicie, jak i o kopiowaniu z
    użyciem operatora konwersji (int), nie ma sensu. Rozmawialiśmy o
    szczególikach, typu:
    1) można się przejechać na big/lit endian
    2) najpierw memcpy, potem operator rzutowania
    3) różny padding w strukturach
    4) różny rozmiar inta na różnych platformach lub wersjach programu.


    > > Rozmawiamy oczywiście o
    > > zgodnych formatach.
    >
    > Co to znaczy zgodnych formatach? Jest jeden format (zwykle znany) i trzeba go
    zdekodować na poszczególne pola (albo odwrotnie - spakować ze znanych wartości pól).
    Te triki z pragmą, polami bitowymi albo rzutowaniem wskaźników to są złe rozwiązania.

    Dlaczego złe? Jeśli ktoś wysyła tablicę struktur wyrównanych do 1 bajta, to
    sytuacja ma się odwrotnie niż pisałeś: Jedynie przez przypadek odczyt
    zadziała na strukturach wyrównanych do 4 bajtów. Dlatego są złe, że nie
    używa się przenośnych funkcji do wysłania i odebrania każdego pola? Owszem
    to drobna wada. Ale wyobraź sobie, że ktoś pisze program tylko na windows i
    tylko na x86, ma strutkurę z 20ma polami i zamiast napisać
    write( &strukt , sizeof(strukt) , file )
    pisze 20 razy:
    write( unwersalny_format_int( strukt.pole1 ) , uniwersalny_rozmiar_int( strukt.pole1
    ) , file );

    Zgodzę się, że kod z memcpy jest ryzykowny, ale po pierwsze ryzyko to pojawia
    się tylko w określonych sytuacjach, a aktywne unikanie tego ryzyka zajmuje
    czas. Zobacz jak łatwo rypnąć się po poprawce pól w strukturze.


    Pozdrawiam




Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: