Convertion binaire en language C

Signaler
Messages postés
33
Date d'inscription
mercredi 18 octobre 2000
Statut
Membre
Dernière intervention
4 janvier 2010
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour,

je souhaiterais convertir n'importe quel type de fichier (txt, jpg, avi, exe ...) en fichier binaire ou plutot en fichier texte contenant un suite de 0 et 1. et la meme chose faire le contraire le reconstruire en language C.



#include <stdio.h>

int main(int argc, char **argv) {
/*
FILE *fp;
fp=fopen("test.c", "wb");
char x[10]="ABCDEFGHIJ";
fwrite(x, sizeof(x[0]), sizeof(x)/sizeof(x[0]), fp);
*/

FILE *fp;
fp=fopen("test.c", "rb");
char x[10];//="ABCDEFGHIJ";
fread(x, sizeof(char), 10, fp);

printf("%d================",sizeof(x));
printf("\n");
for(int i=0;i<sizeof(x);i++)
{

printf("%x==========",x[i]);
//printf("\n");
for(int j=7;j>=0;j--)
{
//printf("(%d)",j);
printf("%d",(x[i]>>j)&(255>>7));
}
printf("\n");
}




}





Merci pour votre aide.

sed

6 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,

Voilà une piste de code :

#include <stdio.h>
#include <stdlib.h>

void ToBin(char* lpOutput, char* lpInput, int nInputSize)
{
  int nInput;
  int nI, nJ;

  nJ = 0;
  for (nI = 0; nI < nInputSize; nI++)
  {
    nInput = lpInput[nI];
    lpOutput[nJ++] = (nInput & 0x80) ? '1' : '0';
    lpOutput[nJ++] = (nInput & 0x40) ? '1' : '0';
    lpOutput[nJ++] = (nInput & 0x20) ? '1' : '0';
    lpOutput[nJ++] = (nInput & 0x10) ? '1' : '0';
    lpOutput[nJ++] = (nInput & 0x08) ? '1' : '0';
    lpOutput[nJ++] = (nInput & 0x04) ? '1' : '0';
    lpOutput[nJ++] = (nInput & 0x02) ? '1' : '0';
    lpOutput[nJ++] = (nInput & 0x01) ? '1' : '0';
  }
}

FILE *SafeOpenFile(char *lpFileName, char *lpMode, FILE **lpFile)
{
  *lpFile = fopen(lpFileName, lpMode);

  if (! *lpFile)
    printf("Cannot open file: "%s"\n", lpFileName);

  return *lpFile;
}

long GetSizeOfFile(FILE* lpFile)
{
  long nCurrentPos;
  long nResult;

  nCurrentPos = ftell(lpFile);

  fseek(lpFile, 0, SEEK_END);
  nResult = ftell(lpFile);

  fseek(lpFile, nCurrentPos, SEEK_SET);

  return nResult;
}

char* LoadFile(FILE* lpFile)
{
  long nFileSize;
  char* lpResult;

  nFileSize = GetSizeOfFile(lpFile);

  lpResult = (char*)malloc(nFileSize);
  if (! lpResult)
    goto the_end;

  if (fread(lpResult, 1, nFileSize, lpFile) != nFileSize)
  {
    free(lpResult);
    lpResult = NULL;
  }

the_end:
  return lpResult;
}

int main()
{
  FILE* lpInputFile;
  FILE* lpOutputFile;
  char* lpInput;
  char* lpOutput;
  long nFileSize;
  int nResult;

  nResult = 1;

  if (! SafeOpenFile("input.txt", "rb", &lpInputFile))
    goto the_end;

  if (! SafeOpenFile("output.txt", "w+b", &lpOutputFile))
    goto the_end;

  lpInput = LoadFile(lpInputFile);
  if (! lpInput)
  {
    printf("Echec du chargement du fichier\n");
    goto the_end;
  }

  nFileSize = GetSizeOfFile(lpInputFile);
  lpOutput = (char*)malloc(nFileSize * 8);
  if (! lpOutput)
  {
    printf("Echec de l'allocation du buffer de sortie\n");
    goto free_input;
  }

  ToBin(lpOutput, lpInput, nFileSize);
  if (fwrite(lpOutput, 1, nFileSize * 8, lpOutputFile) != nFileSize * 8)
  {
    printf("Echec de l'écriture\n");
    goto free_output;
  }

  nResult = 0;
free_output:
  free(lpOutput);
free_input:
  free(lpInput);
the_end:
  return nResult;
}
Messages postés
33
Date d'inscription
mercredi 18 octobre 2000
Statut
Membre
Dernière intervention
4 janvier 2010

Bonjour

c'est vraiment gentil de votre part, ca fonction 100% trés bien
comment je peu faire le contraire recupérer le fichier original

100000000000000000 merci et bonne année 2010

Sedik
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Bin en partant de mon code, tu devrais arriver à non ?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Attention, j'ai oublié les 2 fclose...
Messages postés
33
Date d'inscription
mercredi 18 octobre 2000
Statut
Membre
Dernière intervention
4 janvier 2010

Bonsoir,
j'arrive pas à faire le contraire pour reconstituer le ficheir original, je commence par ou

sed
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Par le début !

Commence par charger le fichier en mémoire avec LoadFile comme dans mon code ci-dessus. Tu vas te retrouver avec une grande chaîne de 0 et de 1.

Tu les parcours 8 par 8 et tu les convertis avec une opération sur les bits comme je l'ai fait dans ToBin.

Quelque chose comme ça :

char nResult
nResult = 0;
if (lpBuffer[nI    ] == '1') nResult &= 0x80;
if (lpBuffer[nI + 1] == '1') nResult &= 0x40;