hex.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /* CC0 license (public domain) - see LICENSE file for details */
  2. #include <ccan/str/hex/hex.h>
  3. #include <assert.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. static bool char_to_hex(unsigned char *val, char c)
  7. {
  8. if (c >= '0' && c <= '9') {
  9. *val = c - '0';
  10. return true;
  11. }
  12. if (c >= 'a' && c <= 'f') {
  13. *val = c - 'a' + 10;
  14. return true;
  15. }
  16. if (c >= 'A' && c <= 'F') {
  17. *val = c - 'A' + 10;
  18. return true;
  19. }
  20. return false;
  21. }
  22. bool hex_decode(const char *str, size_t slen, void *buf, size_t bufsize)
  23. {
  24. unsigned char v1, v2;
  25. unsigned char *p = buf;
  26. while (slen > 1) {
  27. if (!char_to_hex(&v1, str[0]) || !char_to_hex(&v2, str[1]))
  28. return false;
  29. if (!bufsize)
  30. return false;
  31. *(p++) = (v1 << 4) | v2;
  32. str += 2;
  33. slen -= 2;
  34. bufsize--;
  35. }
  36. return slen == 0 && bufsize == 0;
  37. }
  38. static char hexchar(unsigned int val)
  39. {
  40. if (val < 10)
  41. return '0' + val;
  42. if (val < 16)
  43. return 'a' + val - 10;
  44. abort();
  45. }
  46. bool hex_encode(const void *buf, size_t bufsize, char *dest, size_t destsize)
  47. {
  48. size_t i;
  49. if (destsize < hex_str_size(bufsize))
  50. return false;
  51. for (i = 0; i < bufsize; i++) {
  52. unsigned int c = ((const unsigned char *)buf)[i];
  53. *(dest++) = hexchar(c >> 4);
  54. *(dest++) = hexchar(c & 0xF);
  55. }
  56. *dest = '\0';
  57. return true;
  58. }