begin process at 2012 05 30 08:55:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Sélection d'octet


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Sélection d'octet

jeudi 13 mars 2008 à 15:07:26 | Sélection d'octet

dayvid75014

Bonjour à tous,

Je récupère les octets de mon fichier vidéo dans un buffer "Buffer[]" et je voudrais sélectionner les octets 0x47 et je n'y arrive pas. Il me dit constamment "i : variable not found" alors que je l'ai déclaré, et aussi "assertion failure ...ftell.c".
Enfin bon, mon but est d'écrire les octets 0x47 (contenus dans Buffer) dans synchro_bytes et je n'y arrive pas. Je suis deçu depuis quelques heures et j'ai toujours un problème même en utlisant le débuggeur. Je n'en peux plus, je vous demande de l'aide s'il vous plait..

Voici mon code :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>        
#include <string.h>         // Bibliothèques utiles
#include <io.h>
#include <fcntl.h>
#include <windows.h>


void find_TransportStream_synchro_bytes(char *Buffer, int ip_file_length);
void press_key(char press_key_text[]);                // Liste provisoire des prototypes de nos fonctions
void exit_prog(char error_msg[]);                     //   --> à mettre dans un fichier header
unsigned int menu(void);
void option_menu1();
void option_menu2();
void TransportStream_header_decode();


struct TransportStream_header                 
{
unsigned char synchronisation_byte;
unsigned char transport_error_indicator;
unsigned char payload_start_indicator;
unsigned char transport_priority;               // Structure  de l'en-tête TS du flux MPEG
unsigned int PID;
unsigned char transport_scrambling_control;
unsigned char adaptation_field_control;
unsigned char continuity_counter;
} TransportStream_header;

 

//=======================Fonction-Principale=======================================================================================================================

int main(int argc, char *argv[])   
{

    //Déclarations de nos variables
 FILE *ip_file=NULL;
    char ip_filepath[10000];
    int ip_file_length=0,i;  // Longueur du fichier
    int size;
    int synchro_bytes[4] = {0,0,0,0};       // Stockage des premiers octets de synchro
//    char choix_menu;
    int end_of_file = 0;

    if (argc == 1)        //S'il n'y a pas d'argument, on demande à l'utilisateur d'entrer la chaine
    {
        printf("Entrer le chemin de la video:\n");
        //scanf("%s",ip_filepath);                        //Attention n'accepte pas les espaces
        gets(ip_filepath);                                   //Accepte tout jusqu'à l'appuie sur entrée
    }
    else        //entrée d'une chaine en argument du main (en passant par l'invite de commande)
    {
        strcpy(ip_filepath,&argv[1][0]);      //ip_filepath pointe sur le premier argument, premier caractère

    }

    ip_file = fopen(ip_filepath, "rb");   // Ouverture du fichier MPEG en lecture seule ("rb"=read binary)

    if(ip_file==NULL)
 {                 
        printf("Erreur : Impossible d'ouvrir le fichier spécifié \n");      //test d'ouverture du fichier
        exit(0);
 }

    fseek (ip_file , 0, SEEK_END);      //On se place a la fin du fichier
    ip_file_length=ftell (ip_file );       //Retourne le nombre d'octet depuis le debut du fichier jusqu'a la position du curseur(ici la fin)
    rewind (ip_file);                        //on se replace au debut du fichier


    printf("Ouverture du fichier MPEGx %s, contenant %ibytes.\n\n", ip_filepath, ip_file_length);
    printf("Voici la liste des 200 premiers octets de ce flux MPEGx : \n");

    char *Buffer=new char[ip_file_length];
    size=(int)fread(Buffer,1,ip_file_length,ip_file);   //tout le fichier est recopié dans le Buffer
   
    if(size != ip_file_length)
    {
        printf("Erreur lecture\n" );
        exit(0);
    }
    //fclose(ip_file);

   
    for(i=0;i<200;i++)  //juste les n premiers
 {
  if((unsigned char)Buffer[i]<0x10)
  {printf("0x0%x \n" , (unsigned char)Buffer[i]);}
  else
  {printf("0x%x \n" , (unsigned char)Buffer[i]);}       //affichage des octets en héxa
 }      
 //system("pause");
 printf("%x \n" , (unsigned char)Buffer[101]);
 //system("pause");
 // Trouve les octets de synchronisation 0x47:
    find_TransportStream_synchro_bytes(Buffer, ip_file_length);
 system("pause");
 int j=0;
 for(j=0;j<10;j++)
 {
 printf("Voici les 10 premiers octets de synchronisation : 0x%x \n", (unsigned char)synchro_bytes[j]);
    }
 system("pause");

    // Retourne se placer au premier octet de synchronisation:
    //fseek(ip_file, synchro_bytes[1], 0);

    // Menu utilisateur:
    //choix_menu = menu();
      //switch(choix_menu)
   //{
  //case'1':
 //option_menu1();
  //break;
  //case'2':
    //option_menu2();
  //break;
  //case'3':
    //exit_prog("");
  //break;
  //default:
 //puts("\nERREUR : Ceci n'est pas une entrée correcte");
   //}
 
 //system("pause");
    delete []Buffer;
 exit_prog("");
      return 0;
}

//========================================================================================================================================================================

void find_TransportStream_synchro_bytes(char *Buffer, int ip_file_length)
{
    FILE *ip_file=NULL;

 int synchro_bytes[10];
 int nbre_synchro_data=0;
 int position_file=0;
 int i=0;

 for(i=0;i<200;i++)
 {
  if((unsigned char)Buffer[i]==4)
   {
   position_file=ftell(ip_file);
   synchro_bytes[position_file]=*Buffer;
   //printf("%x",*synchro_bytes);
   //printf("%d",position_file);
   //printf("Voici l'octet de synchronisation numéro %d, et son contenu pour vérifier : %x",position_file,*Buffer);
   fseek(ip_file,187,1);      // Aller chercher le nouvel octet de synchronisation, 187 octets plus loin...
   i++;
   }

          else;
 }

   //if(nbre_synchro_data<100)
   //{

   //exit_prog("Erreur : Fin du fichier atteinte avant d'avoir trouve les 100 octets de synchro");
  
   //}

}

//=====================================================================================================================================================================

void press_key(char press_key_text[])

 printf("%s", press_key_text);           
 while ( !_kbhit() )
 {;}
 _getch();
}

//=====================================================================================================================================================================

void exit_prog(char error_msg[])
{
 printf("\n%s\n", error_msg);          
 _fcloseall( );
 press_key("Press a key to exit...");
 exit(0);


//======================================================================================================================================================================

unsigned int menu(void)

 char choix_menu;
 
 puts("Menu:");
    puts("1 - Decodage de l'en-tête");
 puts("2 - Extraire le PES");        // Menu à développer avec de nouvelles options
 puts("3 - Exit");

 puts("\nEntrer_choix:");
 scanf("%s", &choix_menu);

 return  choix_menu;
}

//=====================================================================================================================================================================

void option_menu1()
{
int end_of_file = 0;

while(end_of_file == 0)
{
TransportStream_header_decode();

 


}
puts("Erreur : Fin du fichier atteinte");
}

//=======================================================================================================================================================================


void option_menu2()
{

 

}


//========================================================================================================================================================================

void TransportStream_header_decode()
{
    FILE *ip_file=NULL;
 unsigned int current_header_add = 0; // Ajout d'une en-tête étant décodé/affiché
 int index = 0;       // index for found PID table
 unsigned int search_PID = 0;   // PID value to search for, from command line
 long int payload_start = 0;    // add of payload start when found
 int quite_mode = 0;      // display progress when extracting? yes/no
 int end_of_file = 0;     // check for end of file
 unsigned char TS_raw_header[4];   // 4 byte space to read data from file
    int count= 0;

    printf("\nTaille de l'en-tête du TS: %dbytes", sizeof(TS_raw_header));
 current_header_add = ftell(ip_file);
 fread(&TS_raw_header, sizeof(TS_raw_header), 1, ip_file); // Lecture de l'en-tête
 for (count=0; count <=sizeof(TS_raw_header); count++)
  printf("\nByte %d: \t \t x%x",count, TS_raw_header[count]);

 // Utilisation de masques et décalages afin de récupérer les données que nous voulons dans l'en-tête:

 TransportStream_header.synchronisation_byte = TS_raw_header[0];
 TransportStream_header.transport_error_indicator = (TS_raw_header[1] & 0x80) >> 7;
 TransportStream_header.payload_start_indicator = (TS_raw_header[1] & 0x40) >> 6;
 TransportStream_header.transport_priority = (TS_raw_header[1] & 0x20) >> 5;
 TransportStream_header.PID = ((TS_raw_header[1] & 31) << 8) | TS_raw_header[2];
 TransportStream_header.transport_scrambling_control = (TS_raw_header[3] & 0xC0);
 TransportStream_header.adaptation_field_control = (TS_raw_header[3] & 0x30) >> 4;
 TransportStream_header.continuity_counter = (TS_raw_header[3] & 0xF);  

}

//=========================================================================================================================================================================


Les problèmes sont donc au sein de la fonction "void find_TransportStream_synchro_bytes(char *Buffer, int ip_file_length)". j'ai essayé de jouer avec les system("pause") et les breakpoints sans succès...

Quelqu'un a-t-il une idée ???

Bonne journée à tous.

jeudi 13 mars 2008 à 15:10:29 | Re : Sélection d'octet

dayvid75014

je voulais également les afficher ses octets 0x47 et connaitre leur place dans le buffer mais ...

--> printf me dit "i not found"
-->position_file=ftell(ip_file); ne marche pas

Petite précision : une fois que le premier octet de synchro a été trouvé, le prochain doit nécessairement se trouver 187 octets plus loin, d'où le : fseek(ip_file,187,1);

Sinon je sais que mon programme n'est pas fini mais il se compile sans erreur..
jeudi 13 mars 2008 à 15:12:29 | Re : Sélection d'octet

dayvid75014

Toute dernière précision, je suis novice en langage C (oui je sais ça se voit mais jprécise), je sais que les var globales c'est déconseillé et que les prototypes se mettent dans un point h mais je le ferai plus tard. Sinon j'ai pas mal chercher avant de faire appel à vous mais sans succès, à mon plus grand désarroi..
jeudi 13 mars 2008 à 15:28:02 | Re : Sélection d'octet

Pistol_Pete

Salut

Rapidement, tu as stokke TOUT ton fichier dans ton buffer. Tu n'as donc pas besoin de relir le fichier par la suite et encore moins de faire des ftell alors que tu viens d'initialiser ton fichier a NULL:
FILE *ip_file=NULL;

Pourquoi ne pas faire: position_file=i ?
Ensuite tu n'as plus qu'a faire i+187 pour trouver ton prochain octect de synchro.

A+
Mon site internet : [ Lien ]

jeudi 13 mars 2008 à 15:29:52 | Re : Sélection d'octet

dayvid75014

position_file=i me donne "i not found"...
jeudi 13 mars 2008 à 15:37:10 | Re : Sélection d'octet

luhtor

C'est le bordel ton code. Tu pourrais le nettoyer un peu avant de poster:

void find_TransportStream_synchro_bytes(char *Buffer, int ip_file_length)
{
    FILE *ip_file=NULL;

 int synchro_bytes[10];
 int nbre_synchro_data=0;
 int position_file=0;
 int i=0;

 for(i=0;i<200;i++)
 {
  if((unsigned char)Buffer[i]==4) <= 4 ? c'est quoi 4, je croyais que tu voulais 0x47 ?
   {
   position_file=ftell(ip_file); <= ip_file indéfinit = NULL
   synchro_bytes[position_file]=*Buffer; <= synchro_bytes est une variable locale, pourquoi tu écris dedans ? vu que tout ce que tu écris dedans est détruit dès que tu quittes la fonction. De plus, synchro_bytes a une taille de 10 or j'imagine que position_file sera bien supérieure à 10 donc c'est la cata ici.
   //printf("%x",*synchro_bytes);
   //printf("%d",position_file);
   //printf("Voici l'octet de synchronisation numéro %d, et son contenu pour vérifier : %x",position_file,*Buffer);
   fseek(ip_file,187,1);      // Aller chercher le nouvel octet de synchronisation, 187 octets plus loin... <= pareil, ip_file vaut NULL donc...
   i++; <= Pourquoi tu incrémentes puisque le for le fait ?
   }
else; <= Un else qui sert a quoi ?
}

}

Donc bref, faut que tu revois le passage d'argument, la notion de portée et de visibilité de variable.
jeudi 13 mars 2008 à 15:47:25 | Re : Sélection d'octet

Pistol_Pete

Et le debuggeur il marche comment maintenant?

A+
Mon site internet : [ Lien ]

jeudi 13 mars 2008 à 15:48:38 | Re : Sélection d'octet

dayvid75014

Et sinon tu peux le dire gentiment Luthor ?

jeudi 13 mars 2008 à 15:49:23 | Re : Sélection d'octet

dayvid75014

je commence à m'améliorer Vincent ! ;-)
jeudi 13 mars 2008 à 15:56:08 | Re : Sélection d'octet

SAKingdom

Membre Club
synchro_bytes[position_file]=*Buffer; <= synchro_bytes est une variable locale, pourquoi tu écris dedans ? vu que tout ce que tu écris dedans est détruit dès que tu quittes la fonction. De plus, synchro_bytes a une taille de 10 or j'imagine que position_file sera bien supérieure à 10 donc c'est la cata ici.

Y'a pas que ça. Buffer n'est jamais incrémenté. On ne fait que copier le premier caractère de Buffer dans tout le tableau synchro_bytes.

dayvid75014 >> En gros, ce que dis luhtor, c'est revoie tes bases en langage C. Plusieurs sections de ton code son a refaire complètement. Le fais que tu essais de manipuler un fichier sans même l'avoir ouvert montre que tu ne possède pas encore les connaissances pour faire tel code. Commence par la base, ensuite, monte progressivement. Je le répète souvent mais, on ne fonce jamais tête baissé avec ce langage. Impossible de sauter des étapes. Il faut impérativement passer par la base.

C++ (@++)


1 2

Cette discussion est classée dans : int, file, ip, header, char


Répondre à ce message

Sujets en rapport avec ce message

conversion [ par coyotedef ] salut!!lors de la compilation de mon code une erreur apparait. impossible de trouver un remede. "cannot convert parameter 1 from 'char [10]' to 'char' Hachage fermé problème de lecture [ par mcflysupersonic ] Bonjour je suis nouveau sur le forum est ceci est ma première question donc j'espère que je ne me suis pas trompé d'endroit pour poster.Voilà j'ai un socket RAW ICMP - fonctionnement et implémentation... [ par smirnoff69ice ] Salut, Je suis sur un projet et je dois simuler l'envoi de paquets ICMP sur le réseau. J'ai déjà fait un petit programme de test (repris en partie dep Ouvrir et afficher un fichier texte en C [ par AsM0DeUz ] 'lut Je m'initie actuellement au C. Apres avoir fait les exos les plus basiques ... je passe au basique niveau 2 J'ai ecris qques lignes pour afficher Wad File [ par Nicolas___ ] Bonjour , voila j'ai un petit probleme pour lire 1 fichier WAD (  wad  )donc suivant le modele décrit je me suis fait 2 structures : struct Header{ pointeur de char [ par hacker_mt ] Salut tout le monde voici mon code :#include #include void rajout(char ip[15], char *cmd){         int i, j;         for(i=0;i                         Demande l'aide des meilleurs ! ;) [ par jekburn ] Bonjour, Le programme suivant devrait d'en un futur proche sortir et enregistrer toutes les adresses mail existantes. Mais là, la fatigue surement ! éliminer les doublons ! [ par jekburn ] Bonsoir, J'ai demandé de l'aide y'a 2 semaines, mais là je suis toujours bloqué ! Please help ! Je cherche à supprimer les doublons que me sort mon p liberation de memoire [ par bobaben ] bonjour, je suis debutant en c++. j'ai un petit souci de liberation de memoire. je voudrai savoir comment peut-on desallouer "new" qui est dans une erreur c 1083 [ par wislam2007 ] Salut J'ai dans mon fichier fileHeader.cpp la decalaration de la header comme suit : [code=cpp]extern "C" { #include }[/code] lors de la compilatio


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales