字符串数组为十六进制字符串C++

Rom*_*man 25 c++ buffer hex byte

我之前搜索char*到十六进制字符串,但实现我发现在十六进制字符串的末尾添加了一些非存在的垃圾.我从套接字接收数据包,我需要将其转换为十六进制字符串以进行日志(以null结尾的缓冲区).有人可以建议我对C++有一个很好的实现吗?

谢谢!

Jor*_*nzo 26

假设数据是char*.使用std :: hex的工作示例:

for(int i=0; i<data_length; ++i)
    std::cout << std::hex << (int)data[i];
Run Code Online (Sandbox Code Playgroud)

或者如果你想把它全部保存在一个字符串中:

std::stringstream ss;
for(int i=0; i<data_length; ++i)
    ss << std::hex << (int)data[i];
std::string mystr = ss.str();
Run Code Online (Sandbox Code Playgroud)

  • 你必须使用std:setfill和std :: setw才能正确转换.请参阅:http://stackoverflow.com/a/7639754/1731454 (16认同)
  • 这个答案是不正确的,并且会导致数据损坏。请参阅@oferei 上面评论中的链接以获取正确的示例。 (4认同)
  • 将“char*”数组元素直接转换为“int”或“unsigned int”将导致超过 0x7F 的字节被错误地“符号扩展”。您需要首先将“char”转换为“uint8_t”,然后将其转换为“unsigned int”,以便正确表示字节。请参阅此示例:/sf/ask/4405408031/ (2认同)

K-b*_*llo 11

这是一些东西:

char const hex_chars[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

for( int i = data; i < data_length; ++i )
{
    char const byte = data[i];

    string += hex_chars[ ( byte & 0xF0 ) >> 4 ];
    string += hex_chars[ ( byte & 0x0F ) >> 0 ];
}
Run Code Online (Sandbox Code Playgroud)


dem*_*emi 9

最简单的:

int main()
{
    const char* str = "hello";
    for (const char* p = str; *p; ++p)
    {
        printf("%02x", *p);
    }
    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 这***适用于nul-terminate字符串.所以最有可能的是,它只会给他一个同样的问题,促使他提出他的问题. (5认同)

Ale*_*nov 8

我在这里找到了很好的例子Display-char-as-Hexadecimal-String-in-C++

  std::vector<char> randomBytes(n);
  file.read(&randomBytes[0], n);

  // Displaying bytes: method 1
  // --------------------------
  for (auto& el : randomBytes)
    std::cout << std::setfill('0') << std::setw(2) << std::hex << (0xff & (unsigned int)el);
  std::cout << '\n';

  // Displaying bytes: method 2
  // --------------------------
  for (auto& el : randomBytes)
    printf("%02hhx", el);
  std::cout << '\n';
  return 0;
Run Code Online (Sandbox Code Playgroud)

如上所示的方法1可能是更多的C++方式:

Cast to an unsigned int
用于std::hex将值表示为十六进制数字
使用std::setwand std::setfillfrom <iomanip>to format
请注意,您需要屏蔽 cast int0xff以显示最低有效字节:
(0xff & (unsigned int)el)

否则,如果设置了最高位,则转换将导致三个最高有效字节设置为ff


Tom*_*mas 5

上面的代码段在字符串中提供了错误的字节顺序,因此我对其进行了一些修复。

char const hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',   'B','C','D','E','F'};

std::string byte_2_str(char* bytes, int size) {
  std::string str;
  for (int i = 0; i < size; ++i) {
    const char ch = bytes[i];
    str.append(&hex[(ch  & 0xF0) >> 4], 1);
    str.append(&hex[ch & 0xF], 1);
  }
  return str;
}
Run Code Online (Sandbox Code Playgroud)

  • 这可以是对K-ballo答案的评论,也可以是答案(您可以提及已解决的问题)。请编辑。 (3认同)

Mar*_*k R 5

使用升压:

#include <boost/algorithm/hex.hpp>

std::string s("tralalalala");
std::string result;
result.reserve(s.size() * 2);
boost::algorithm::hex_lower(s, std::back_inserter(result));
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/jEc1vPW38