Hexadezimale Anzeige von Strings

Datum: 2002-07-17
Quelle: suse-linux

Worum ging es?

Man kann in C mit der (s)printf-Funktion einzelne Zeichen in ihrer hexadezimalen Notation ausgeben. Das ist aber ein ziemlich umständlicher Weg, weil jedes Zeichen einzeln ausgegeben werden muss. Es geht aber auch ohne. Das nachfolgende Code-Beispiel arbeitet zwar auch zeichenweise, kommt jedoch innerhalb der eigentlichen Konvertierungsfunktionen ohne diese Bibliotheksfunktionen aus. Die Funktionen arbeiten mit Bit-Operatoren, schieben sich also die Bits an die Stelle, an der sie für die Auswertung durch die Makros HD und DH gebraucht werden.

Code
#include <stdlib.h>
#include <stdio.h>
#define HD(c) ((c)<10?(c)+48:(c)+55)
#define DH(c) ((c)>'9'?(c)-'A'+10:(c)-'0')

void unpack();
void pack();

int main(int argc, char *argv[]) {
  char in[16] = "123abcABC$%?";
  char out[32];
  memset(out, 0, 32);
  unpack(in, out);
  printf("<%s> <%s>\n", in, out);
  memset(in, 0, 16);
  pack(out, in);
  printf("<%s> <%s>\n", in, out);
  return(0);
}

void unpack(char *from, char *to) {
  while (*from) {
    *(to ++) = HD((*from&0xf0)>>4);
    *(to ++) = HD(*from&0x0f);
    from ++;
  }
}

void pack(char *from, char *to) {
  while (*from) {
    *(to++) = (DH(*from)<<4)|DH(*(from+1));
    from += 2;
  }
}
Beschreibung

Den Code sollte man unter einem netten Namen (z. B. hexshow.c) abspeichern und kann ihn dann mit
gcc -o hexshow hexshow.c oder einfach
make hexshow
in ein ausführbares Programm verwandeln. Die in der Funktion main() enthaltenen Befehle dienen nur der Demonstration, die eigentliche Umwandlung findet in den beiden Funktionen pack() und unpack() statt.