Génére un tableau de caractére au format c contenant le byte code de n'importe quel fichier

Soyez le premier à donner votre avis sur cette source.

Vue 4 917 fois - Téléchargée 147 fois

Description

Ce programme génére un fichier texte contenant le code cpp de l'affectation des octets d'un fichier, à un tableau de caractére au format c.
suite a cela, il ne reste plus qu'a copier/coller le code dans un projet c/cpp, et a créer un nouveau fichier qui contiendra octet pour octet le contenu du tableau de caractére au format C, fraichement généré par le code suivant:

Source / Exemple :


#include <cstdlib>
#include <iostream>
#include <unistd.h> //write/close/
#include <fcntl.h> //open/2eme parametre de open sauf 'O_TEXT'/
#include <sys/stat.h> //3eme parametre de open/

using namespace std;

int main(int argc, char *argv[])
{
    int id, idt;
    char nomfichier[64];
    char nomsortie[64];
    char contenu[1000000];
    char temphex[32];
    //char nomvar[16];
    char tempimp[32];
    int taille;
    
    printf("Entrer le nom du fichier BINAIRE a convertir: ");
    scanf("%s",nomfichier);
    
    printf("Entrer le nom du fichier de SORTIE.txt: ");
    scanf("%s",nomsortie);
    sprintf(nomsortie, "%s.txt", nomsortie);
    /*
    printf("Entrer le nom de la variable contenant le byte code: ");
    scanf("%s",&nomvar);*/
    
    idt = open(nomsortie, O_BINARY|O_WRONLY|O_CREAT, S_IWRITE | S_IREAD);
    id  = open(nomfichier,O_BINARY|O_RDONLY);

    if(id!=-1){
        lseek(id, 0x00, SEEK_SET);
        taille = lseek(id, 0x00, SEEK_END);
        lseek(id, 0x00, SEEK_SET);
        if(taille == read(id, &contenu, taille)){printf("\nLecture ... OK\n\n");}else{printf("\nErreur anormale a la lecture...\n\n");/*Normalement faudrais stoper*/}
        write(idt, "{", 1);
        for(int i=0,h=0 ; i<taille ; i++,h++){

            if(h==16){printf("\n");h=0;}//pour la pagination
            
            for(int k=0;k<31;k++){temphex[k]='\0';tempimp[k]='\0';}
            
            sprintf(temphex,"%x",(unsigned char)contenu[i]);
            
            /*if(temphex[0]=='f'&&temphex[1]=='f'&&temphex[2]=='f'&&temphex[3]=='f'&&temphex[4]=='f'&&temphex[5]=='f'){
                sprintf(tempimp,",0x%c%c",temphex[6], temphex[7]);
            }else{*/
                if( temphex[1]!='0'&&temphex[1]!='1'&&temphex[1]!='2'&&temphex[1]!='3'&&temphex[1]!='4'&&temphex[1]!='5'&&
                temphex[1]!='6'&&temphex[1]!='7'&&temphex[1]!='8'&&temphex[1]!='9'&&temphex[1]!='a'&&temphex[1]!='b'&&
                temphex[1]!='c'&&temphex[1]!='d'&&temphex[1]!='e'&&temphex[1]!='f'
                ){ 
                    
                    sprintf(tempimp,",0x0%c",temphex[0]);
                }else{
                    
                    sprintf(tempimp,",0x%c%c",temphex[0], temphex[1]);
                }//fin du si l'octet vaut zero
            //}//fin du si y'a le beugue du ffffff
            
            printf("%s",tempimp);
            write(idt, tempimp, strlen(tempimp));
        }
        
        
        write(idt, "}", 1);
        
        sprintf(tempimp,"\n\nLongueur octal: %d",taille);
        write(idt, tempimp, strlen(tempimp));
        
        close(idt);
        close(id);
    }else{
        printf("\nErreur d'ouverture du fichier...\n\n");    
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}

Conclusion :


Pour conclure, ce code peu étre utile pour tout ce que chacun y trouvera d'utile. pour ma par il n'y a pas de débordement sans bytecode

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
239
Date d'inscription
vendredi 20 octobre 2006
Statut
Membre
Dernière intervention
20 avril 2009

Salut,

Quelques petites choses en vrac :
> CptPingu, pour le coup du scanf("%s", &nomfichier),
> étrangement ça marche aussi

Non, ca a l'air de marcher uniquement parce que ton tableau est declare dans la pile... si tu modifie d'autres variables, tu peux tres bien perdre un bout de ce que tu as lu (a verifier, mais c'est sans doute implementation dependant).

- A quoi sert ce programme :
Il y a plusieurs reponses :
- Sous Windows pour faire des applications windows : A rien...
Les resources sont la pour ca.
- Sous Windows pour faire du cross-compilation (par exemple developper une appli pour une console de jeu), ca peut etre pratique, mais dans ce cas, il vaudrait mieux que ton programme utilise les parametres de ligne de commande afin de pouvoir etre utilise dans un makefile.
Par exemple, tu pourais avoir pour integrer une image dans ton source:
toto.c : toto.jpg
tonexe toto.jpg

Si ton exe a pour dependance toto.o, le makefile va construire toto.c a partir du jpg en utilisant la regle specifiee, puis toto.o a partir du .c en utilisant la regle implicite (cc -c).

Note que dans ce cas, il est judicieux de generer un .c et le .h qui va avec (pour declarer tes variables en "extern").

Tant que tu es a generer du C, il est aussi bien pratique de generer une deuxieme variable contenant la taille de ton objet (parce que tu ne veux pas avoir a changer ton code chaque fois que tu changes ton image jpg).

Pour faire court, ce genre de programme est pratique dans certains cas, mais il reste des choses a implementer pour que ce soit vraiment pratique.

Eric
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Oups en effet, bit 7 (le poids fort) et non bit 0 !!!
Messages postés
75
Date d'inscription
samedi 3 décembre 2005
Statut
Membre
Dernière intervention
30 juin 2013

j'ai fais ce code uniquement dans le but d'obtenir le byte code de fichier executable et non pour en faire une œuvre dernier cri. mais je suis entiérement ouvert à la connaissance d'autre syntaxes
Messages postés
75
Date d'inscription
samedi 3 décembre 2005
Statut
Membre
Dernière intervention
30 juin 2013

bein ecoute BruNews, j'utilise ce que mes professeurs m'ont enseigné (tant bien que mal), si tu a de nouvelles fonctions de l'api, développe ce que tu sais, j'aimerais savoir !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
RECTIF:
devient négatif quand le bit le plus haut est positionné, donc dans la cas d'un char c'est le bit[7].

Kertimanoff, si tu dédies un code à Windows alors tiu peux tout refaire, les scanf et autres histoires de flux sont à reléguer aux musées. Il y a une API qu'il convient d'utiliser.
Afficher les 13 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.