Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

VISUALISEUR HEXDECIMAL POUR CONSOLE EN C


Information sur la source

Catégorie :Application Classé sous : visualisateur, console, hexadecimal Niveau : Initié Date de création : 11/01/2005 Date de mise à jour : 05/03/2005 20:57:32 Vu / téléchargé: 3 204 / 107

Note :
Aucune note

Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Ce programme permet l'affichage en mode hexadecimal du contenu binaire d'un fichier donné. Son avantage est qu'il ne lit que la partie du fichier qu'on est entrain de voir, ce qui réduit énormément les resources consommés et rend la navigation dans le contenu binaire d'un fichier rapide est aisée même s'il fait quelque centaines de MO. le tout se fait au travers des touches de navigation habituelles du clavier.
Le code utilise les fonctionnalités de conio et wincon. Il peut être vu comme un exemple d'utilisation des fonctions associées. Il peut être compilé avec mingw, cygwin ou Visual C++. Sous Cygwin, ne pas oublier d'utiliser l'option "-mno-cygwin" à gcc.
 

Source

  • /************************************************************************
  • * *
  • * A hexadecimal viewer for files on console *
  • * *
  • * Author : M. Idrassi *
  • * *
  • * History : 10-01-2004 First version *
  • * *
  • * *
  • ************************************************************************/
  • #include <stdio.h>
  • #include <io.h>
  • #include <stdlib.h>
  • #include <memory.h>
  • #include <conio.h>
  • #include <windows.h>
  • #include <string.h>
  • FILE *inputFile;
  • long fileLength;
  • HANDLE hStdout;
  • CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
  • /* print a 16 byte buffer into a line */
  • void printBuffer(unsigned char *buffer,int counter,int blockIndex)
  • {
  • int i;
  • char c;
  • _cprintf("%.8X: ",blockIndex*16);
  • for(i=0;i<16;i++)
  • {
  • if(i < counter)
  • _cprintf("%.2X",buffer[i]);
  • else
  • _cprintf(" ");
  • }
  • _cprintf(" | ");
  • for(i=0;i<16;i++)
  • {
  • if(i < counter)
  • {
  • c = buffer[i];
  • if(c == '\r' || c == '\n' || c == '\t' || c == '\b' || c == '\a' || c == '\v' || c == '\f')
  • _cprintf(".");
  • else
  • _cprintf("%c",buffer[i]);
  • }
  • else
  • _cprintf(" ");
  • }
  • }
  • /* Given the position of the stream, print a hex preview of
  • * a maximum number of bytes equal to nbLines*16
  • */
  • void printFile(int index,int nbLines,int nbColumns)
  • {
  • int i,counter;
  • unsigned char buffer[16];
  • COORD cursor;
  • cursor.X = 0;
  • cursor.Y = 0;
  • if(fseek(inputFile,index,SEEK_SET))
  • return;
  • SetConsoleCursorPosition(hStdout,cursor);
  • for(i=0;i<nbLines;i++)
  • {
  • counter = fread(buffer,1,16,inputFile);
  • if(!counter)
  • break;
  • printBuffer(buffer,counter,i+(index>>4));
  • if(counter < 16)
  • {
  • i++;
  • break;
  • }
  • else if(i != nbLines - 1)
  • _cprintf("\n");
  • }
  • if(counter < 16)
  • {
  • for(;i<nbLines;i++)
  • {
  • _cprintf("\n");
  • for(counter=0;counter<61;counter++)
  • _cprintf(" ");
  • }
  • }
  • }
  • BOOL WINAPI ProgHandler(DWORD CtrlType)
  • {
  • switch(CtrlType)
  • {
  • case CTRL_C_EVENT:
  • case CTRL_CLOSE_EVENT:
  • /* free allocated resources */
  • fclose(inputFile);
  • CloseHandle(hStdout);
  • return TRUE;
  • break;
  • default:
  • return FALSE;
  • }
  • }
  • int main(int argc, char **argv)
  • {
  • int nbLines ,index,ignore,i,c,nbColumns;
  • char str[512];
  • char *ptr;
  • if(argc != 2)
  • {
  • printf("Usage : %s FileName\n",argv[0]);
  • return -1;
  • }
  • /* open the file on binary mode for reading */
  • inputFile = fopen(argv[1],"rb");
  • if(!inputFile)
  • {
  • printf("Failed opening file for reading!\n");
  • return -1;
  • }
  • /* remove any path specification from the file name */
  • ptr = argv[1] + (strlen(argv[1]) - 1);
  • while(ptr != argv[1] && *ptr != '\\' && *ptr != '/')
  • ptr--;
  • if(*ptr == '\\' || *ptr == '/')
  • ptr++;
  • /* get the fileLength of the file */
  • fileLength = filelength(fileno(inputFile));
  • /* put the file name and its size on the console title */
  • sprintf(str,"Hex Viewer by IDRASSI %s (%d bytes)",ptr,fileLength);
  • SetConsoleTitle(str);
  • /* We will use a new screen buffer for the viewer instead of the parent console one */
  • hStdout = CreateConsoleScreenBuffer(GENERIC_READ|GENERIC_WRITE,
  • FILE_SHARE_READ|FILE_SHARE_WRITE,
  • NULL,
  • CONSOLE_TEXTMODE_BUFFER,
  • NULL);
  • SetConsoleActiveScreenBuffer(hStdout);
  • SetConsoleCtrlHandler(ProgHandler,TRUE);
  • index = 0;
  • ignore = 0;
  • while(TRUE)
  • {
  • if(!ignore)
  • {
  • /* Get the current screen buffer size and window position. */
  • GetConsoleScreenBufferInfo(hStdout, &csbiInfo);
  • /* retreive the current size of the console */
  • nbLines = csbiInfo.srWindow.Bottom - csbiInfo.srWindow.Top + 1;
  • nbColumns = csbiInfo.srWindow.Right - csbiInfo.srWindow.Left + 1;
  • printFile(index,nbLines,nbColumns);
  • }
  • ignore = 1;
  • /* waiting for a key stroke
  • * sleep for 1ms to reduce resource consumption
  • */
  • while(!(i = kbhit()))
  • Sleep(1);
  • /* read the key */
  • c = getch();
  • if(c == 'q' || c == 'Q')
  • break;
  • else if(c == 0xE0) /* a function key was hit */
  • {
  • c = getch(); /* get the real value */
  • switch(c) {
  • case 0x4F: /* end */
  • case 0x75: /* CTRL + end */
  • {
  • /* go to the end of the file */
  • index = fileLength - 16*nbLines;
  • if(index > 0)
  • ignore = 0;
  • break;
  • }
  • case 0x77: /* CTRL + home */
  • case 0x47: /* home */
  • {
  • /* go to the begining of the file */
  • index = 0;
  • ignore = 0;
  • break;
  • }
  • case 0x48: /* up */
  • {
  • if(index)
  • {
  • index -= 16;
  • ignore = 0;
  • }
  • break;
  • }
  • case 0x49 : /* page up */
  • {
  • if(index)
  • {
  • /* read the previous 16*nbLines bytes on the stream */
  • index -= 16*nbLines;
  • if(index < 0)
  • index = 0;
  • ignore = 0;
  • }
  • break;
  • }
  • case 0x50: /* down */
  • {
  • if(!index || ((fileLength - index) > (nbLines*16)))
  • {
  • index += 16;
  • ignore = 0;
  • }
  • break;
  • }
  • case 0x51: /* page down */
  • {
  • /* read the next 16*nbLines bytes on the stream */
  • if(!index || ((fileLength - index) > (nbLines*16)))
  • {
  • index += 16*nbLines;
  • if(index != fileLength)
  • {
  • ignore = 0;
  • }
  • }
  • break;
  • break;
  • }
  • }
  • }
  • }
  • /* close the file */
  • fclose(inputFile);
  • /* free the created screen buffer */
  • CloseHandle(hStdout);
  • return 0;
  • }
/************************************************************************
 *																		*
 *		A hexadecimal viewer for files on console						*
 *																		*
 * Author : M. Idrassi													*
 *																		*
 * History : 10-01-2004 First version									*
 *																		*
 *																		*
 ************************************************************************/



#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <memory.h>
#include <conio.h>
#include <windows.h>
#include <string.h>

FILE *inputFile;
long fileLength;
HANDLE hStdout; 
CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 


/* print a 16 byte buffer into a line */
void printBuffer(unsigned char *buffer,int counter,int blockIndex)
{
	int i;
	char c;
	_cprintf("%.8X: ",blockIndex*16);
	for(i=0;i<16;i++)
	{
		if(i < counter)
			_cprintf("%.2X",buffer[i]);
		else
			_cprintf("  ");
	}
	_cprintf(" | ");
	for(i=0;i<16;i++)
	{
		if(i < counter)
		{
			c = buffer[i];
			if(c == '\r' || c == '\n' || c == '\t' || c == '\b' || c == '\a' || c == '\v' || c == '\f')
				_cprintf(".");
			else
				_cprintf("%c",buffer[i]);
		}
		else
			_cprintf(" ");
	}
}


/* Given the position of the stream, print a hex preview of
 * a maximum number of bytes equal to nbLines*16
 */
void printFile(int index,int nbLines,int nbColumns)
{
	int i,counter;
	unsigned char buffer[16];
	COORD cursor;


	cursor.X = 0;
	cursor.Y = 0;

	if(fseek(inputFile,index,SEEK_SET))
		return;

	SetConsoleCursorPosition(hStdout,cursor);

	for(i=0;i<nbLines;i++)
	{
		counter = fread(buffer,1,16,inputFile);
		if(!counter)
			break;
		printBuffer(buffer,counter,i+(index>>4));
		if(counter < 16)
		{
			i++;
			break;
		}
		else if(i != nbLines - 1)
			_cprintf("\n");
	}

	if(counter < 16)
	{
		for(;i<nbLines;i++)
		{
			_cprintf("\n");
			for(counter=0;counter<61;counter++)
				_cprintf(" ");
		}
	}
}

BOOL WINAPI ProgHandler(DWORD CtrlType)
{
	switch(CtrlType)
	{
	case CTRL_C_EVENT:
	case CTRL_CLOSE_EVENT:
		/* free allocated resources */
		fclose(inputFile);
		CloseHandle(hStdout);
		return TRUE;
		break;
	default:
		return FALSE;
	}
}


int main(int argc, char **argv)
{
	int nbLines ,index,ignore,i,c,nbColumns;
	char str[512];
	char *ptr;

	if(argc != 2)
	{
		printf("Usage : %s FileName\n",argv[0]);
		return -1;
	}

	/* open the file on binary mode for reading */
	inputFile = fopen(argv[1],"rb");
	if(!inputFile)
	{
		printf("Failed opening file for reading!\n");
		return -1;
	}

	/* remove any path specification from the file name */
	ptr = argv[1] + (strlen(argv[1]) - 1);
	while(ptr != argv[1] && *ptr != '\\' && *ptr != '/')
		ptr--;

	if(*ptr == '\\' || *ptr == '/')
		ptr++;

	/* get the fileLength of the file */
	fileLength = filelength(fileno(inputFile));

	/* put the file name and its size on the console title */
	sprintf(str,"Hex Viewer by IDRASSI           %s (%d bytes)",ptr,fileLength);
	SetConsoleTitle(str);

	/* We will use a new screen buffer for the viewer instead of the parent console one */
	hStdout = CreateConsoleScreenBuffer(GENERIC_READ|GENERIC_WRITE,
										FILE_SHARE_READ|FILE_SHARE_WRITE,
										NULL,
										CONSOLE_TEXTMODE_BUFFER,
										NULL);
	SetConsoleActiveScreenBuffer(hStdout);


	SetConsoleCtrlHandler(ProgHandler,TRUE);
 

	index = 0;
	ignore = 0;

	while(TRUE)
	{
		if(!ignore)
		{
			/* Get the current screen buffer size and window position. */
			GetConsoleScreenBufferInfo(hStdout, &csbiInfo);

			/* retreive the current size of the console */
			nbLines = csbiInfo.srWindow.Bottom - csbiInfo.srWindow.Top + 1;
			nbColumns = csbiInfo.srWindow.Right - csbiInfo.srWindow.Left + 1;
			printFile(index,nbLines,nbColumns);
		}

		ignore = 1;

		/* waiting for a key stroke
		 * sleep for 1ms to reduce resource consumption
		 */
		while(!(i = kbhit()))
			Sleep(1);

		/* read the key */
		c = getch();


		if(c == 'q' || c == 'Q')
			break;
		else if(c == 0xE0) /* a function key was hit */
		{
			c = getch();	/* get the real value */
			switch(c) {
			case 0x4F: /* end */
			case 0x75: /* CTRL + end */
				{
					/* go to the end of the file */
					index = fileLength - 16*nbLines;
					if(index > 0)
						ignore = 0;

					break;
				}
			case 0x77: /* CTRL + home */
			case 0x47: /* home */
				{
					/* go to the begining of the file */
					index = 0;
					ignore = 0;
					break;
				}
			case 0x48: /* up */
				{
					if(index)
					{
						index -= 16;
						ignore = 0;
					}
					break;
				}
			case 0x49 : /* page up */
				{
					if(index)
					{
						/* read the previous 16*nbLines bytes on the stream */
						index -= 16*nbLines;
						if(index < 0)
							index = 0;
						ignore = 0;
					}
					break;
				}
			case 0x50: /* down */
				{
					if(!index || ((fileLength - index) > (nbLines*16)))
					{
						index += 16;
						ignore = 0;
					}
					break;
				}
			case 0x51: /* page down */
				{
					/* read the next 16*nbLines bytes on the stream */
					if(!index || ((fileLength - index) > (nbLines*16)))
					{
						index += 16*nbLines;
						if(index != fileLength)
						{
							ignore = 0;
						}
					}
					break;
					break;
				}
			}
		}
	}

	/* close the file */
	fclose(inputFile);

	/* free the created screen buffer */
	CloseHandle(hStdout);
	
	return 0;
}

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

11 janvier 2005 00:56:14 :
11 janvier 2005 01:01:17 :
Rajout d'un screen-shot
05 mars 2005 20:57:32 :

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

effacer l'ecran de la console dos en C [ par gollum ] Comment effecer l'ecran de la console DOS en C ? [VC++] Taille du text dans une application console [ par Cybmat ] SalutVoila je voudrai savoir comment on change la taille du text ecrit dans uneapplication console avec printf() .Merci d'avance BCBv3. Utilisation de AnsiString en mode console [ par jm14d ] Pour utiliser la classe AnsiString sous Borland v3, en mode graphique c'est OK : j'inclus VCL.h et ça fonctionne. Par contre en mode console je ne m'e Conversion hexadecimal -> decimal ( et contraire) en C [ par Arrakis ] Bonjour,Je ne connais pas de fonction pour realiser cette conversion du decimal vers l'hexa, si vous avez une idéemerciArrakis comment utilise t on les couleurs sous la console [ par psycho ] j aimerais savoir quels sont les instructions qui permettent d incorporer de la couleur sous la console(j utilise visual studio), ainsi que les fichie Propriété de la fenetre de console [ par Orkblutt ] Salut,j'aimerai fixer les parametres de la fenetre de console: largeur, hauteur, tampon...Quelle est la classe à utiliser pour configurer ces parametr Du son sous console dos (devcpp) ? [ par dionysos ] Bonjour,Quelles fonctions et quelles bibliotheques utiliser pour emettre des sons (de differentes tonalites ou de differentes frequences), en C, conso Du son sous console dos...? [ par dionysos ] Bonjour,Quelles fonctions et quelles bibliotheques utiliser pour emettre des sons (de differentes tonalites ou de differentes frequences), en C, conso Du son sous console dos???? [ par dionysos ] bonjour,avec devcpp quelles fonctions et quelles bibliotheques utiliser pour générer du son en console dos, et en C.Merci focus console [ par jmz ] Bonjour,J'ai une appli avec 1 fenetre principale et la console qui me sert de "trace".Tout marche bien, j'écris plein de chose en couleurs dans ma con


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.