]> mj.ucw.cz Git - libucw.git/commitdiff
Added a simple module for making and parsing hexdumps.
authorMartin Mares <mj@ucw.cz>
Wed, 25 Jun 2008 19:11:17 +0000 (21:11 +0200)
committerMartin Mares <mj@ucw.cz>
Wed, 25 Jun 2008 19:11:17 +0000 (21:11 +0200)
lib/Makefile
lib/str-hex.c [new file with mode: 0644]
lib/string.h

index 3b3f259f6ab00eac5c560757c372f6dbd11024ba..1196df8f0a458e1b7b1dc201988f1244fd6d9a3d 100644 (file)
@@ -31,7 +31,7 @@ LIBUCW_MODS= \
        base64 base224 \
        sync \
        qache \
-       string str-esc str-split str-match str-imatch \
+       string str-esc str-split str-match str-imatch str-hex \
        bbuf \
        getopt
 
diff --git a/lib/str-hex.c b/lib/str-hex.c
new file mode 100644 (file)
index 0000000..3dd3e43
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ *     UCW Library -- Hexdumping and Unhexdumping
+ *
+ *     (c) 2008 Martin Mares <mj@ucw.cz>
+ *
+ *     This software may be freely distributed and used according to the terms
+ *     of the GNU Lesser General Public License.
+ */
+
+#include "lib/lib.h"
+#include "lib/string.h"
+#include "lib/chartype.h"
+
+static uns
+hex_make(uns x)
+{
+  return (x < 10) ? (x + '0') : (x - 10 + 'a');
+}
+
+void
+mem_to_hex(char *dest, const byte *src, uns bytes)
+{
+  while (bytes--)
+    {
+      *dest++ = hex_make(*src >> 4);
+      *dest++ = hex_make(*src & 0x0f);
+      src++;
+    }
+  *dest = 0;
+}
+
+static uns
+hex_parse(uns c)
+{
+  c = Cupcase(c);
+  c -= '0';
+  return (c < 10) ? c : (c - 7);
+}
+
+const char *
+hex_to_mem(byte *dest, const char *src, uns max_bytes)
+{
+  while (max_bytes-- && Cxdigit(src[0]) && Cxdigit(src[1]))
+    {
+      *dest++ = (hex_parse(src[0]) << 4) | hex_parse(src[1]);
+      src += 2;
+    }
+  return src;
+}
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int main(void)
+{
+  byte x[4] = { 0xfe, 0xed, 0xf0, 0x0d };
+  byte y[4];
+  char a[10];
+
+  mem_to_hex(a, x, 4);
+  puts(a);
+  const char *z = hex_to_mem(y, a, 4);
+  if (*z)
+    return 1;
+  printf("%02x%02x%02x%02x\n", y[0], y[1], y[2], y[3]);
+
+  return 0;
+}
+
+#endif
index 50c4dc475b8aed3b1e0d3aa5419e2854cb2db6bd..6b0ed593e17a2579d7dd57b109337d8290417b65 100644 (file)
@@ -29,6 +29,11 @@ int str_wordsplit(char *str, char **rec, uns max);
 int str_match_pattern(const char *patt, const char *str);
 int str_match_pattern_nocase(const char *patt, const char *str);
 
+/* str-hex.c */
+
+void mem_to_hex(char *dest, const byte *src, uns bytes);
+const char *hex_to_mem(byte *dest, const char *src, uns max_bytes);
+
 /* md5hex.c */
 
 void md5_to_hex(const byte *s, char *d);