Pereiti prie turinio

CMD

Nariai
  • Pranešimai

    16
  • Užsiregistravo

  • Lankėsi

  • Atsiliepimai

    0%

CMD Pranešimai

  1. Ačiū rimcx dar kartą. Viskas veikia puikiai.

     

    Dar vienas klausimėlis, kad nekurti atskiros temos. Ar tokiu būdu bus N-tasis narys keičiamas baitu 0xFF mūsų pakete, kuriame rasta ieškoma baitų seka?

     

    unsigned char data[4]={0x00,0x00,0x01,0xb3};
    int k = 0;
    int j;
    int N = 25;
    while(k < m->data_len) {
    
    
       if (m->payload[k] != 0x00) {
           k++;
       			       }
       else {
       if (memcmp(&m->payload[k],data,sizeof(data))==0) {
    if(j % N == 0) { 
    
    m->payload[j]=0xff;
    
                  }
        else {break;}  	                              } 
    else {
    k++;   }
    j++;	 }
    	      }

     

    EDIT3: Problema išspręsta.

  2. su memcmp bitų nepaieškosi, teks terliotis su bitwise operatoriais :)

     

    unsigned char ieskomi_duomenys[]={0x00,0x00,0x01,0xB6};
    int idx = 0;
    while (1) {
       if (m->payload[idx] != 0) {
           idx++;
       }
       else {
           if (memcmp(&m->payload[idx],ieskomi_duomenys,4) == 0) {
               // sekancio baito pirmieji 2 bitai
               unsigned bitai=m->payload[idx+sizeof(ieskomi_duomenys)]&0x03;
    
    
               break;
           }
       }
    }
    

     

    OK. Jei jau kankintis tai iki galo. Ar aš gerai suprantu, kad unsigned bitai pasimame sekantį baitą einantį po mūsų ieškomų duomenų? idx yra pirmas mūsų ieškomas narys + ieškomas dydis ir atsiduriam kaip tik už ieškomų duomenų.

    Tada ANDinam:

    x x x x x x x x (0xXX)

    0 0 0 0 0 0 1 1 (0x03)

    0 0 0 0 0 0 x x gaunam.

     

    Ar nereikėtų man ANDint su 0xC0, ko pasekoje gaučiau rezultatą: x x 0 0 0 0 0 0. Ar čia aš blogai kažką suprantu? Ar įmanoma tuos du bitukus per printf kažkaip išvesti į ekraną(kiek ieškojau tai neradau panašaus formato)? Vis dar nepagaunu esmės kaip pasiekiamas palyginimas. Atsiprašau jeigu klausimai skamba nelabai logiškai. Dar kartą ačiū už pagalbą :)

     

    Edit: Rytas už vakarą protingesnis, tikiuosi. Jeigu suANDinus su 0xC0 gaunu kažkokį baitą, tai jo du pirmi bitukai liks nepakitę. Tada vėl galiu naudoti memcmp tam poto einančiam baitui ir lyginti su su 0xC0 ar pirmi bitukai 11 arba lyginti su kokiu 0x40 ar 0x80 jei pirmi bitukai 01 ar 10. O paėmus 0x00 galiu patikrinti ar turiu pradžioje 00. Tikiuosi labai nenusišnekėjau.

  3. Gali pavyzdžiui skippinti per baitus, kol sutiksi NULL, o tada memcmp. Jei nelygu - skippini iki kito NULL :)

     

    Ačiū už pagalbą. Dar porą klausimėlių.

    Gal galima būtų šiek tiek ant kelio užvesti kaip tas skipinimas per baitus atrodo? Nes nesu su tokiu dalyku susidūręs.

    Ir ką daryti tokiu atveju jeigu reikia ieškoti reikšmės 0x00 0x00 0x01 0xb6 00 (01 ar 11) t.y. po jų iškart einančių dviejų bitukų?

  4.  unsigned char ieskomi_duomenys[4]={0x00,0x00,0x01,0xB6};
     int kur_ieskoti=0;
     if(memcmp(&m->payload[kur_ieskoti],ieskomi_duomenys,sizeof(ieskomi_duomenys))==0)
     {
         printf("MPEG packet");
         // ...
     }

     

    Dėkui už pagalbą, viskas veikia. Tačiau, ką man daryti jeigu duomenys, kuriuos noriu palyginti yra ne nuo pradžios, o tarkime prasideda nuo 10 baito?

     

    kur_ieskoti tiesiog nurodau norimą reikšmę ir tiek?

  5. Sveiki,

     

    Dirbu su libipq ir vaizdo paketais ir žinau, kad MPEG4 paketai prasideda reikšme 00 00 01 B6. Kaip aš galiu patikrinti ar tikrai dirbu su MPEG4. Kaip aš galėčiau nuskaityti informaciją iš buferio paimtų paketų, kad palyginti turimas reikšmes? Ką reikėtų daryti, jeigu nuskaitoma informacija būtų ne pradžioje paketo, o tarkime 5-8 baitai? Ačiū už bet kokią pagalbą.

     

     case IPQM_PACKET: 
    {
    // paimu paketus is buferio cia
     ipq_packet_msg_t *m = ipq_get_packet(buf);
    
      int x;
     if(value in m->payload[x] == value) ??
    {
     printf("MPEG packet");
    x++;
    }
    
    // ir grazinu cia
    status = ipq_set_verdict(h, m->packet_id,NF_ACCEPT, 0, NULL); 
    
     break;
        }
    

    Pilnas kodas: http://pastebin.com/raw.php?i=c2UgZkEj

     

    CMD

×
×
  • Pasirinkite naujai kuriamo turinio tipą...