1. void hexstring_from_data(const void *data, size_t len, char *output) {
    2. const unsigned char *buf = (const unsigned char *)data;
    3. size_t i, j;
    4. for (i = j = 0; i < len; ++i) {
    5. char c;
    6. c = (buf[i] >> 4) & 0xf;
    7. c = (c > 9) ? c + 'a' - 10 : c + '0';
    8. output[j++] = c;
    9. c = (buf[i] & 0xf);
    10. c = (c > 9) ? c + 'a' - 10 : c + '0';
    11. output[j++] = c;
    12. }
    13. }
    14. std::string hexstring_from_data(const void *data, size_t len) {
    15. if (len == 0) {
    16. return std::string();
    17. }
    18. std::string result;
    19. result.resize(len * 2);
    20. hexstring_from_data(data, len, &result[0]);
    21. return result;
    22. }
    23. //字符串转十六进制字符流 字符串
    24. std::string hexstring_from_data(const std::string &data) {
    25. return hexstring_from_data(data.c_str(), data.size());
    26. }
    27. void data_from_hexstring(const char *hexstring, size_t length, void *output) {
    28. unsigned char *buf = (unsigned char *)output;
    29. unsigned char byte;
    30. if (length % 2 != 0) {
    31. throw std::invalid_argument("data_from_hexstring length % 2 != 0");
    32. }
    33. for (size_t i = 0; i < length; ++i) {
    34. switch (hexstring[i]) {
    35. case 'a':
    36. case 'b':
    37. case 'c':
    38. case 'd':
    39. case 'e':
    40. case 'f':
    41. byte = (hexstring[i] - 'a' + 10) << 4;
    42. break;
    43. case 'A':
    44. case 'B':
    45. case 'C':
    46. case 'D':
    47. case 'E':
    48. case 'F':
    49. byte = (hexstring[i] - 'A' + 10) << 4;
    50. break;
    51. case '0':
    52. case '1':
    53. case '2':
    54. case '3':
    55. case '4':
    56. case '5':
    57. case '6':
    58. case '7':
    59. case '8':
    60. case '9':
    61. byte = (hexstring[i] - '0') << 4;
    62. break;
    63. default:
    64. throw std::invalid_argument("data_from_hexstring invalid hexstring");
    65. }
    66. ++i;
    67. switch (hexstring[i]) {
    68. case 'a':
    69. case 'b':
    70. case 'c':
    71. case 'd':
    72. case 'e':
    73. case 'f':
    74. byte |= hexstring[i] - 'a' + 10;
    75. break;
    76. case 'A':
    77. case 'B':
    78. case 'C':
    79. case 'D':
    80. case 'E':
    81. case 'F':
    82. byte |= hexstring[i] - 'A' + 10;
    83. break;
    84. case '0':
    85. case '1':
    86. case '2':
    87. case '3':
    88. case '4':
    89. case '5':
    90. case '6':
    91. case '7':
    92. case '8':
    93. case '9':
    94. byte |= hexstring[i] - '0';
    95. break;
    96. default:
    97. throw std::invalid_argument("data_from_hexstring invalid hexstring");
    98. }
    99. *buf++ = byte;
    100. }
    101. }
    102. std::string data_from_hexstring(const char *hexstring, size_t length) {
    103. if (length % 2 != 0) {
    104. throw std::invalid_argument("data_from_hexstring length % 2 != 0");
    105. }
    106. if (length == 0) {
    107. return std::string();
    108. }
    109. std::string result;
    110. result.resize(length / 2);
    111. data_from_hexstring(hexstring, length, &result[0]);
    112. return result;
    113. }
    114. //十六进制字符流转字符串
    115. std::string data_from_hexstring(const std::string &hexstring) {
    116. return data_from_hexstring(hexstring.c_str(), hexstring.size());
    117. }
    118. int main()
    119. {
    120. std::string str = "2e7c8080";
    121. char str2[21] = {0};
    122. str2[0] = 0x2E;
    123. str2[1] = 0x7C;
    124. str2[2] = 0x80;
    125. str2[3] = 0x80;
    126. std::string str22 = str2;
    127. std::cout << "str: " << str << std::endl;
    128. std::cout << "str22: " << str22 << std::endl;
    129. std::cout << "data_from_hexstring: " << data_from_hexstring(str) << std::endl;
    130. if (data_from_hexstring(str) == str22)
    131. std::cout << "厉害厉害" << std::endl; 144
    132. std::string comp = hexstring_from_data(str22);
    133. std::cout << " hexstring_from_data: " << comp << std::endl;
    134. if (str == comp)
    135. std::cout << "牛啊牛啊" << std::endl;
    136. return 0;
    137. }