hex.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "hex.h"
  2. const char* const Char2DigitTable = ("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  3. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  4. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  5. "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\xff\xff\xff\xff\xff\xff" //0-9
  6. "\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff" //A-Z
  7. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  8. "\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff" //a-z
  9. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  10. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  11. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  12. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  13. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  14. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  15. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  16. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  17. "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff");
  18. char* HexEncode(const void* in, size_t len, char* out) {
  19. const unsigned char* b = (const unsigned char*)in;
  20. const unsigned char* e = b + len;
  21. while (b != e) {
  22. *out++ = DigitToChar(*b / 16);
  23. *out++ = DigitToChar(*b++ % 16);
  24. }
  25. return out;
  26. }
  27. void* HexDecode(const void* in, size_t len, void* ptr) {
  28. const char* b = (const char*)in;
  29. const char* e = b + len;
  30. Y_ENSURE(!(len & 1), TStringBuf("Odd buffer length passed to HexDecode"));
  31. char* out = (char*)ptr;
  32. while (b != e) {
  33. *out++ = (char)String2Byte(b);
  34. b += 2;
  35. }
  36. return out;
  37. }
  38. TString HexEncode(const void* in, size_t len) {
  39. TString ret;
  40. ret.ReserveAndResize(len << 1);
  41. HexEncode(in, len, ret.begin());
  42. return ret;
  43. }
  44. TString HexDecode(const void* in, size_t len) {
  45. TString ret;
  46. ret.ReserveAndResize(len >> 1);
  47. HexDecode(in, len, ret.begin());
  48. return ret;
  49. }