C programozás 2

Kezdőlap Fórumok Programozás C programozás 2

10 bejegyzés megtekintése - 11-20 / 76
  • Szerző
    Bejegyzés
  • #2017247
    pointux
    Felhasználó

      „Azért kell mert a BMP fileknek van header része amibõl kiderül hogy alkalmas e steganographias célra vagy sem. „
      Szerintem bármelyikbe el lehet rejteni információkat… mint laikus mondom csak. (Az persze kérdés, hogy milyen hatékonysággal.)

      „Meg van adva hogy melyik mezõ hány bájt és ha más típusú változóba (pl 2 bájtos értéket egy 4 bájtos változóba ) olvasok be akkor néhány érték nem megfelelõ lesz.”
      Miért? Ezt nem értem. „125” 2 byte-ben, meg 4 byte-ban is 125… vagy nem? Az más kérdés, hogy a másik 2 byte-ot le***-od.

      #2017248
      szati
      Felhasználó

        Miért? Ezt nem értem. „125” 2 byte-ben, meg 4 byte-ban is 125… vagy nem? Az más kérdés, hogy a másik 2 byte-ot le***-od.

        Ez azért nem ilyen simán megy. pl egy if(bmih->biBitCount != 24) -nél ha a bmih->biBitCount 2 bájtos akkor az értéket helyesen 24-nek olvassa ki voszont ha 4 bájt akkor már „szemetet” is beolvas és az így kapott szám hiába kezdõdik 24-el, az öszehasonlító mûveletnél nem lessz azonos a két érték.

        #2017249
        pointux
        Felhasználó

          „Ez azért nem ilyen simán megy. pl egy if(bmih->biBitCount != 24) -nél ha a bmih->biBitCount 2 bájtos akkor az értéket helyesen 24-nek olvassa ki voszont ha 4 bájt akkor már „szemetet” is beolvas és az így kapott szám hiába kezdõdik 24-el, az öszehasonlító mûveletnél nem lessz azonos a két érték.”
          Most mi van? A szemét az = 0-val… Ha véletlenül mégis volt valami odaírva elõtte, ki kell nullázni, vagy maszkolni, ahogy mutattam. (sõt eleve if (valtozo | 24); egyébként ez akkor hasznos, ha csak bitek fontosak a bytban;
          pl.:
          #define color_mask 1
          #define palette_mask 2
          #define gray_mask 4
          #define bw_mask 8

          if (mask | color_mask) {
          printf(„ez szines”);
          }
          if (!(mask | bw_mask)) {
          printf(„ez pedig nem fekete-fehér”);
          })
          (Az megint más kérdés, hogy a file-ból, meg szemetet eleve nem másolsz bele a változódba ugye?)

          #2017250
          szati
          Felhasználó

            Most mi van? A szemét az = 0-val… Ha véletlenül mégis volt valami odaírva elõtte, ki kell nullázni, vagy maszkolni, ahogy mutattam. (sõt eleve if (valtozo | 24); egyébként ez akkor hasznos, ha csak bitek fontosak a bytban;
            pl.:
            #define color_mask 1
            #define palette_mask 2
            #define gray_mask 4
            #define bw_mask 8

            if (mask | color_mask) {
            printf(„ez szines”);
            }
            if (!(mask | bw_mask)) {
            printf(„ez pedig nem fekete-fehér”);
            })
            (Az megint más kérdés, hogy a file-ból, meg szemetet eleve nem másolsz bele a változódba ugye?)

            Most ezt nem értemm megin légyszi szájbarágósan mert még nehezen megy. Kérdéseim: Mért pont logikai vagy? Mit jelent a maszkolás, hogyan kell? Mit jelent a kinullázás, hogyan kell? Egész fenti kóddal mit tudok elérni?

            #2017251
            pointux
            Felhasználó

              Adott egy 4 byteos változó a memóriában az így néz ki:
              0x00000000
              ebbe a file-ból bemásolsz 2 byte-ot, mely mondjuk 255-ös szám, akkor ez így fog kinézni:
              0x000000FF, ha nem 4, hanem 2 byte-os, akkor így néz ki 0x00FF – ugyanaz. (a szemét az nulla)
              Ha ezt ki akarod nullázni azt kizáró vagy mûvelettel végzed el (praktikusan) önmagával:
              var XOR var (0x000000FF XOR 0x000000FF) – ami azt jelenti, hogy ahol egyforma a bit nullává válik.

              szerencsére a c nyelv var=0; kifejezést pont mindig pont így végzi el (de éppen ezért számodra ez lényegtelen)

              „Mért pont logikai vagy?”
              Mert a logikai vagy esetén akkor válik 1-é a végeredmény bit, ha mindkét forrásbit 1
              0 0 -> 0
              1 0 -> 0
              0 1 -> 0
              1 1 -> 1

              Tehát:
              color_mask = 00000001
              palette_mask = 00000010
              gray_mask = 00000100

              mondjuk (gray_mask OR bármi) kifejezés értéke csak akkor és csakis akkor válik nem 0-vá, ha a bármiban a 3. bit 1 (vagyis a bármi azonos gray_mask-kal, vagy gray_mask + szeméttel)
              másik példa ((gray_mask AND color_mask) OR bármi) kifejezés értéke akkor és csakis akkor válik nem 0-vá, ha bármi tartalmazza a gray_mask-ot ill. a color_mask-ot is.

              Nos azért hoztam fel ezt a példát, mert ha bitképekkel fogsz dolgozni ezt az eljárást ismerned kell.

              „Egész fenti kóddal mit tudok elérni?”
              Pont a gyakorlati jelentését írtam ide (legalábbis bitképeknél):
              if (mask | color_mask) {
              printf(„ez szines”);
              }
              if (!(mask | bw_mask)) {
              printf(„ez pedig nem fekete-fehér”);
              }

              #2017252
              kisbetu
              Felhasználó

                Mert a logikai vagy esetén akkor válik 1-é a végeredmény bit, ha mindkét forrásbit 0

                Ezt javítsd ki!

                #2017253
                Leslieman
                Felhasználó

                  Mert a logikai vagy esetén akkor válik 1-é a végeredmény bit, ha mindkét forrásbit 0
                  0 0 -> 0
                  1 0 -> 0
                  0 1 -> 0
                  1 1 -> 0

                  Vizsla! Itt nem rontottál el valamit?
                  Elõször is mindenhol 0 van, ez gondolom elgépelés, másodszor pedig logikai ‘vagy’ esetén a kifejezés értéke akkor lesz ‘Igaz’, ha valamelyik tag értéke ‘Igaz’.

                  Ráadásul a következõ mintapéldában a ‘|’ nem is logikai vagy, hanem ‘bitmûvelet vagy’. A logikai vagy az a ‘||’.

                  #2017254
                  kisbetu
                  Felhasználó

                    Maradjunk annyiban, hogy lehet nullára és lehet egyre maszkolni (egyiket vagyolva, másikat éselve). Az adott feladattól függ, hogy éppen melyiket használjuk.

                    Mindenesetre Vizsla majd kijavítja, ha visszajön.

                    #2017255
                    Leslieman
                    Felhasználó

                      Meg van adva hogy melyik mezõ hány bájt és ha más típusú változóba (pl 2 bájtos értéket egy 4 bájtos változóba ) olvasok be akkor néhány érték nem megfelelõ lesz.

                      Ezt kb úgy szokták megoldani, hogy ugye tudod, hány bájt a teljes fejléc, ezért ezt az egészet beolvasod egy memória területre:

                      Code:
                      #define HEADER_MERET 18

                      unsigned char header[HEADER_MERET];

                      //load the file header
                      file.seekg (0, ios::beg);
                      file.read((char *) header, sizeof(header));
                      ….
                      m_width = header[12] + header[13] * 256;
                      m_height = header[14] + header[15] * 256;
                      color_depth = header[16];

                      Ez ugyan c++ kód, de az elv a lényeg.

                      #2017256
                      Leslieman
                      Felhasználó

                        Maradjunk annyiban, hogy lehet nullára és lehet egyre maszkolni (egyiket vagyolva, másikat éselve). Az adott feladattól függ, hogy éppen melyiket használjuk.

                        Minden tiszteletem a tiétek, kisbetu, de a ‘bites vagy (|) ‘ használatával a kód mindig igazat ad, így használhatatlan az én olvasatomban. Vagy valamit tényleg félre nézek. :rolleyes:

                      10 bejegyzés megtekintése - 11-20 / 76
                      • Be kell jelentkezni a hozzászóláshoz.