C ile basit HEX editör yapımı

Katılım
30 Ağustos 2020
Mesajlar
563
Makaleler
1
Çözümler
2
C programlama dili kullanarak basit bir HEX editör yaptım. Kodunu paylaşacağım. Windows sistemlerde sorunsuz çalışıyor, diğerleri hakkında fikrim yok. Kodda bir hata varsa ve yazarsanız elimden gelirse düzeltirim.

[CODE lang="c" title="HEX.c"]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>

#define MAX_COL 9
#define MAX_MEM 32768

#define print_help_message() printf("%s",\
"Parametresi ile girilen dosyayý heximal bir biçimde yazdýrýr."\
)

struct deger
{
int x, y;
unsigned char deger;
};

int save_to_file(unsigned char *str, unsigned length, FILE *file)
{
unsigned index = 0;
fseek(file, 0L, SEEK_SET);
if(file == 0) return 1;
for(index = 0; index < length; index++)
{
fprintf(file, "%c", str[index]);
fflush(file);
}
return 0;
}

unsigned char *change_value(struct deger *degmez, unsigned char *str)
{
int index = degmez->x * MAX_COL + degmez->y;
str[index] = degmez->deger;
return str;
}

void print_str_to_screen_hex(unsigned char *str, unsigned length)
{
unsigned index = 0, col = 0, line = 0, temp = 0;
printf("HEX");
for(temp = 0; temp < MAX_COL; temp++)
{
printf(" %XH", temp);
}
printf("\n00H ");
for(index = 0, col = 0, line = 0; index < length; index++, col++)
{
if(col >= MAX_COL)
{
printf(" ");
for(temp = index-MAX_COL; temp < index; temp++) /* Karakterlerin ASCII karsiligi. */
{
printf("%c", (str[temp] >= 32 && str[temp] <= 255) ? str[temp] : '.'); /* Yazilamayan karakterler duzeni bozmamasi icin '.' koulur. */
}
printf("\n%02XH ", ++line);
col = 0;
}
printf(" 0x%02X ", str[index]); /* Karakterlerin Heximal karsiligi */
}
if(col != 0)
{
for(temp = 5+col*6; temp < 63 /* Deneme yanilma */; temp++)
{
printf(" ");
}
for(temp = index-col; temp < index; temp++) /* Son satirdaki karakterlerin ASCII karsiligini yazabilmek icin. */
{
printf("%c", (str[temp] >= 32 && str[temp] <= 255) ? str[temp] : '.');
}
}
}

int main(int argc, char **argv)
{
FILE *file;
int index = 0;
struct deger degmez;
unsigned char *str = (unsigned char*)malloc(sizeof(char)*MAX_MEM); /* Bu artabilir. */
setlocale(LC_ALL, "Turkish");
if(argc == 1 || strcmp(argv[1], "/?") == 0)
{
print_help_message();
return 0;
}
else if(argc > 2)
{
fprintf(stderr, "Wrong number of parametrs.\n");
return 1;
}
file = fopen(argv[1], "r+b");
if(file == 0)
{
fprintf(stderr, "File can't open.\n");
return 1;
}
for(index = 0; feof(file) == 0; index++)
{
str[index] = fgetc(file);
}
str[index-1] = '\0';
while(1){
print_str_to_screen_hex(str, index-1); /* Degerleri ekrana basar. */
printf("\n\nKaydetmek için -1, Çýkmak için -2 yazýnýz.\n"
"Yeni deðerini deðiþtireceðiniz kutunun konumunu giriniz:\n");

x_hatasi:
printf("\rX: ");
scanf("%x", &degmez.x);
if(degmez.x > MAX_MEM) goto x_hatasi;
else if(degmez.x == -2) break;
else if(degmez.x == -1) /* kaydet */
{
fprintf(stderr, (save_to_file(str, index-1, file) == 1) ? "Dosyaya kaydedilemedi!\n" : "Dosyaya kaydedildi.\n");
goto x_hatasi; /* x i tekrar sorar. */
}
printf("\n");

y_hatasi:
printf("\rY: ");
scanf("%x", &degmez.y);
if(degmez.y >= MAX_COL || degmez.y < -2) goto y_hatasi;
else if(degmez.y == -2) break;
else if(degmez.y == -1) /* kaydet */
{
fprintf(stderr, (save_to_file(str, index-1, file) == 1) ? "Dosyaya kaydedilemedi!\n" : "Dosyaya kaydedildi.\n");
goto x_hatasi; /* x i ve y yi tekrar sormak icin */
}
printf("\n");
printf("\rHex deðer (0x ya da h olmadan): ");
scanf("%x", &degmez.deger);
change_value(&degmez, str);
}
fclose(file);
return 0;
}
[/CODE]
 
C programlama dili kullanarak basit bir HEX editör yaptım. Kodunu paylaşacağım. Windows sistemlerde sorunsuz çalışıyor, diğerleri hakkında fikrim yok. Kodda bir hata varsa ve yazarsanız elimden gelirse düzeltirim.

[CODE lang="c" title="HEX.c"]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>

#define MAX_COL 9
#define MAX_MEM 32768

#define print_help_message() printf("%s",\
"Parametresi ile girilen dosyayý heximal bir biçimde yazdýrýr."\
)

struct deger
{
int x, y;
unsigned char deger;
};

int save_to_file(unsigned char *str, unsigned length, FILE *file)
{
unsigned index = 0;
fseek(file, 0L, SEEK_SET);
if(file == 0) return 1;
for(index = 0; index < length; index++)
{
fprintf(file, "%c", str[index]);
fflush(file);
}
return 0;
}

unsigned char *change_value(struct deger *degmez, unsigned char *str)
{
int index = degmez->x * MAX_COL + degmez->y;
str[index] = degmez->deger;
return str;
}

void print_str_to_screen_hex(unsigned char *str, unsigned length)
{
unsigned index = 0, col = 0, line = 0, temp = 0;
printf("HEX");
for(temp = 0; temp < MAX_COL; temp++)
{
printf(" %XH", temp);
}
printf("\n00H ");
for(index = 0, col = 0, line = 0; index < length; index++, col++)
{
if(col >= MAX_COL)
{
printf(" ");
for(temp = index-MAX_COL; temp < index; temp++) /* Karakterlerin ASCII karsiligi. */
{
printf("%c", (str[temp] >= 32 && str[temp] <= 255) ? str[temp] : '.'); /* Yazilamayan karakterler duzeni bozmamasi icin '.' koulur. */
}
printf("\n%02XH ", ++line);
col = 0;
}
printf(" 0x%02X ", str[index]); /* Karakterlerin Heximal karsiligi */
}
if(col != 0)
{
for(temp = 5+col*6; temp < 63 /* Deneme yanilma */; temp++)
{
printf(" ");
}
for(temp = index-col; temp < index; temp++) /* Son satirdaki karakterlerin ASCII karsiligini yazabilmek icin. */
{
printf("%c", (str[temp] >= 32 && str[temp] <= 255) ? str[temp] : '.');
}
}
}

int main(int argc, char **argv)
{
FILE *file;
int index = 0;
struct deger degmez;
unsigned char *str = (unsigned char*)malloc(sizeof(char)*MAX_MEM); /* Bu artabilir. */
setlocale(LC_ALL, "Turkish");
if(argc == 1 || strcmp(argv[1], "/?") == 0)
{
print_help_message();
return 0;
}
else if(argc > 2)
{
fprintf(stderr, "Wrong number of parametrs.\n");
return 1;
}
file = fopen(argv[1], "r+b");
if(file == 0)
{
fprintf(stderr, "File can't open.\n");
return 1;
}
for(index = 0; feof(file) == 0; index++)
{
str[index] = fgetc(file);
}
str[index-1] = '\0';
while(1){
print_str_to_screen_hex(str, index-1); /* Degerleri ekrana basar. */
printf("\n\nKaydetmek için -1, Çýkmak için -2 yazýnýz.\n"
"Yeni deðerini deðiþtireceðiniz kutunun konumunu giriniz:\n");

x_hatasi:
printf("\rX: ");
scanf("%x", &degmez.x);
if(degmez.x > MAX_MEM) goto x_hatasi;
else if(degmez.x == -2) break;
else if(degmez.x == -1) /* kaydet */
{
fprintf(stderr, (save_to_file(str, index-1, file) == 1) ? "Dosyaya kaydedilemedi!\n" : "Dosyaya kaydedildi.\n");
goto x_hatasi; /* x i tekrar sorar. */
}
printf("\n");

y_hatasi:
printf("\rY: ");
scanf("%x", &degmez.y);
if(degmez.y >= MAX_COL || degmez.y < -2) goto y_hatasi;
else if(degmez.y == -2) break;
else if(degmez.y == -1) /* kaydet */
{
fprintf(stderr, (save_to_file(str, index-1, file) == 1) ? "Dosyaya kaydedilemedi!\n" : "Dosyaya kaydedildi.\n");
goto x_hatasi; /* x i ve y yi tekrar sormak icin */
}
printf("\n");
printf("\rHex deðer (0x ya da h olmadan): ");
scanf("%x", &degmez.deger);
change_value(&degmez, str);
}
fclose(file);
return 0;
}
[/CODE]
Hex Editör ne işe yarıyor?
 
1632425483910.png

?
 

Yeni konular

Geri
Yukarı