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

?
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı