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

问题描述 投票:20回答:7

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

谢谢!

c++ hex buffer byte
7个回答
23
投票

假设数据是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();

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 ];
}

9
投票

最简单的:

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

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;
}

0
投票

您可以尝试使用此代码将字节从数据包转换为以null结尾的字符串,并存储到“字符串”变量进行处理。

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”的字符串数组。


0
投票

使用boost:

#include <boost/algorithm/hex.hpp>

std::string s("tralalalala");
std::string result;
boost::algorithm::hex(s.begin(), s.end(), std::back_inserter(result));

-1
投票

你可以使用std::hex

例如。

std::cout << std::hex << packet;
© www.soinside.com 2019 - 2024. All rights reserved.