Ecrire un fichier directement en hexadécimal

AlphaScorpius Messages postés 2 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 11 novembre 2007 - 11 nov. 2007 à 04:13
AlphaScorpius Messages postés 2 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 11 novembre 2007 - 11 nov. 2007 à 13:43
Bonjour,

Après m'être récemment interrogé sur la manière dont l'on pouvait créer un fichier bitmap, et avoir étudié leur structure hexadécimale, j'en suis arrivé à la question: "mais comment écrit-on un fichier en hexadécimal à la base?".

J'ai donc cherché un peu partout avec google sur la manière d'écrire un fichier en hexa, mais je me suis vite rendu qu'absolument toutes les fonctions que je trouvais faisaient intervenir une chaine de caractères comme argument, chaine qui serait ensuite écrite dans le fichier. Le mystère reste donc entier pour moi, c'est pourquoi je suis venu ici dans l'espoir que quelqu'un pourrait éclairer ma lanterne.

Pour expliciter ce que je voudrais pouvoir faire:

J'aimerais pouvoir écrire par exemple "a5" dans un fichier, et en ouvrant ce fichier avec un éditeur hexadecimale voir exactement a5, et pas la convertion hexadécimale de la chaine de caractères "a5" qui se traduirait par 61 35 ou quelque chose du genre.

Merci d'avance.

3 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 nov. 2007 à 09:26
Normal de ne pas comprendre si on se demande comment franchir l'échelon 5 avant d'avoir passé le 2.

Un fichier "hexa" serait un fichier texte, l'hexa n'étant qu'une représentation de ce qui est vraiment et toujours en interne, DU BINAIRE.

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 nov. 2007 à 13:06
Salut,
Utilise cette fonction ca devrait marcher:

DWORD __stdcall Write2Hex(char* FilePath, char* szData)
{
static const BYTE Table[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65 , 0x66};
HANDLE hFile;
BYTE* Buffer;
DWORD DataLen 0, i 0, bw = 0;
DataLen = strlen(szData);
if(!DataLen) goto Error;
hFile = CreateFile(FilePath, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) goto Error;
Buffer = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE|HEAP_ZERO_MEMORY, (DataLen*2)+1);
if(!Buffer) goto Error;
while(1)
{
Buffer[2*i] = Table[(szData[i]>>4) & 0x0f];
Buffer[2*i+1] = Table[(szData[i]) & 0x0f];
if(i == DataLen) break;
i++;
}
if(!WriteFile(hFile, Buffer, (DataLen*2), &bw, 0)) goto Error;
Error:
if(hFile) CloseHandle(hFile);
if(Buffer) HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, Buffer);
return bw;
}

Neo_Fr
0
AlphaScorpius Messages postés 2 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 11 novembre 2007
11 nov. 2007 à 13:43
@[auteur/BRUNEWS/39449.aspx BruNews]

Désolé de l'imprecision, effectivement quand je dis vouloir écrire en "hexa" j'ai pleinement conscience que cela revient à écrire directement le fichier en binaire, le passage de l'un à l'autre n'étant pas bien compliqué.

@[auteur/NEOFR/639176.aspx Neo_Fr]

Merci pour la fonction, je vais la décortiquer pour comprendre morceau par morceau comment elle fonctionne.
0
Rejoignez-nous