C ile Hex Viewer (Görüntüleyici) Yapımı

C ile hexdump benzeri bir hex viewer yapımı.

C programlama dili ile belirtilen dosyayı veya önceki komuttan yönlendirilen çıktıyı (stdin) konsol ekranına veya yönlendirilen çıkışa (stdout) her baytın hex gösterimi, adres bilgisi ve ASCII karakterler olarak yazan bir uygulama yapımı.

#include <stdio.h>          // fopen(), fclose(), printf(), getc() vb. için
#include <errno.h>          // strerror() ile kullanılan errno için

FILE* file;                 // Okunacak dosya veya stdin
int c;                      // Okunan karakter
int charIndex = 0;          // Karakterin satırdaki konumu (sütun)
char buff[16] = { 0 };      // Okunan baytların ASCII gösterimleri
unsigned int addr = 0;      // Okunan baytın adresi (dosyadaki konumu)

void dump_buff(int len) {
    for (charIndex = 0; charIndex < len; charIndex++) {
        // Karakter gösterilebilir (grafik)
        if (isgraph(buff[charIndex])) { printf("%c", buff[charIndex]); }
         // Bir kontrol karakteri, tab veya boşluk yerine "." göster.
        else { printf("."); }
    }
    printf("n"); // Alt satıra geç
}

int main(int argc, char** argv) {
    if (argc == 2) { file = fopen(argv[1], "r"); }
	else if (!isatty(fileno(stdin))) { file = stdin; }
	else { printf("USAGE %s file OR `cmd` | %s", argv[0], argv[0]); return 0; }
    if (file == NULL) { printf("%s", strerror(errno)); return 1; }
    printf("%8s 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0fn", " ");
    while ((c = getc(file)) != -1) {
        if (addr % 16 == 0) { printf("%08x ", addr); } // Başa adresi yaz
        printf("%02x ", c);         // Karakteri yaz (ae, 02, 3b .. gibi)
        buff[charIndex++] = c;      // Karakteri tampona da yaz
        if (addr % 16 == 15) { dump_buff(16); charIndex = 0; } // ASCII göster
        addr++;
    }
    if (charIndex > 0) { // Okunan baytlar 16 dan az ise (ama 0 değil)
        char format[16];
        sprintf(format, "%%%ds", (16 - charIndex) * 3);
        printf(format, " ");    // ASCII sütununa kadar boşluklarla doldur
        dump_buff(charIndex);   // ASCII göster
    }
    fclose(file); // Dosyayı kapat
    return 0;
}

 

Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git