我之前搜索过char*到hex字符串,但是我发现实现在hex字符串的末尾添加了一些不存在的垃圾。我从套接字接收数据包,我需要将它们转换为hex字符串用于日志(空终止缓冲区)。有人能告诉我一个好的C++实现吗?谢谢!
char*
hex
C++
pvcm50d11#
假设数据为char*。使用std::hex的示例:
for(int i=0; i<data_length; ++i) std::cout << std::hex << (int)data[i];
或者,如果您想将所有内容保存在字符串中:
std::stringstream ss; for(int i=0; i<data_length; ++i) ss << std::hex << (int)data[i]; std::string mystr = ss.str();
kknvjkwl2#
这里有一些东西:
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 ]; }
bvk5enib3#
最简单的:
int main() { const char* str = "hello"; for (const char* p = str; *p; ++p) { printf("%02x", *p); } printf("\n"); return 0; }
nom7f22z4#
我在这里找到了一个很好的例子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;
如上所示的方法1可能更适合C++:强制转换为无符号整数使用std::hex将值表示为十六进制数字使用<iomanip>中的std::setw和std::setfill进行格式化请注意,您需要对0xff屏蔽强制转换int,以显示最低有效字节:(0xff & (unsigned int)el) .否则,如果设置了最高位,则强制转换将导致三个最高有效字节被设置为ff。
std::hex
<iomanip>
std::setw
std::setfill
0xff
(0xff & (unsigned int)el)
ff
ie3xauqp5#
上面的代码片段在字符串中提供了不正确的字节顺序,所以我稍微修正了一下。
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; }
ldxq2e6h6#
使用升压:
#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));
https://godbolt.org/z/jEc1vPW38
1dkrff037#
您可以尝试使用此代码将数据包中的字节转换为以空结尾的字符串,并存储到“string”变量中进行处理。
const int buffer_size = 2048; // variable for storing buffer as printable HEX string char data[buffer_size*2]; // receive message from socket int ret = recvfrom(sock, buffer, sizeofbuffer, 0, reinterpret_cast<SOCKADDR *>(&from), &size); // bytes converting cycle for (int i=0,j=0; i<ret; i++,j+=2){ char res[2]; itoa((buffer[i] & 0xFF), res, 16); if (res[1] == 0) { data[j] = 0x30; data[j+1] = res[0]; }else { data[j] = res[0]; data[j + 1] = res[1]; } } // Null-Terminating the string with converted buffer data[(ret * 2)] = 0;
当我们发送十六进制字节为0x01020E0F的消息时,变量“data”包含字符串为“01020e0f”的字符数组。
svgewumm8#
您可以使用std::hex例如:
std::cout << std::hex << packet;
8条答案
按热度按时间pvcm50d11#
假设数据为char*。使用std::hex的示例:
或者,如果您想将所有内容保存在字符串中:
kknvjkwl2#
这里有一些东西:
bvk5enib3#
最简单的:
nom7f22z4#
我在这里找到了一个很好的例子Display-char-as-Hexadecimal-String-in-C++:
如上所示的方法1可能更适合C++:
强制转换为无符号整数
使用
std::hex
将值表示为十六进制数字使用
<iomanip>
中的std::setw
和std::setfill
进行格式化请注意,您需要对
0xff
屏蔽强制转换int,以显示最低有效字节:(0xff & (unsigned int)el)
.否则,如果设置了最高位,则强制转换将导致三个最高有效字节被设置为
ff
。ie3xauqp5#
上面的代码片段在字符串中提供了不正确的字节顺序,所以我稍微修正了一下。
ldxq2e6h6#
使用升压:
https://godbolt.org/z/jEc1vPW38
1dkrff037#
您可以尝试使用此代码将数据包中的字节转换为以空结尾的字符串,并存储到“string”变量中进行处理。
当我们发送十六进制字节为0x01020E0F的消息时,变量“data”包含字符串为“01020e0f”的字符数组。
svgewumm8#
您可以使用std::hex
例如: