Char массив в шестнадцатеричную строку С++
Раньше я искал строку char*
в строке hex
, но обнаруженная реализация добавляет немного несуществующего мусора в конце строки hex
. Я получаю пакеты из сокета, и мне нужно преобразовать их в строки hex
для журнала (буфер с нулевым символом в конце). Может кто-нибудь посоветовать мне хорошую реализацию для C++
?
Спасибо!
Ответы
Ответ 1
Предполагаемые данные - это 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();
Ответ 2
Вот что-то:
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 ];
}
Ответ 3
Самый простой:
int main()
{
const char* str = "hello";
for (const char* p = str; *p; ++p)
{
printf("%02x", *p);
}
printf("\n");
return 0;
}
Ответ 4
Фрагмент кода выше предоставляет неправильный порядок байтов в строке, поэтому я немного его исправил.
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;
}
Ответ 5
Я нашел хороший пример здесь 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++ способом:
Приведение к неподписанному int
Используйте std::hex
, чтобы представить значение в виде шестнадцатеричных цифр
Используйте std::setw
и std::setfill
из <iomanip>
для форматирования
Обратите внимание, что вам нужно замаскировать приведение типа int к 0xff
для отображения младший байт:
(0xff & (unsigned int)el)
.
В противном случае, если установлен старший бит, приведение приведет к трем самые значимые байты установлены в ff
.
Ответ 6
Использование надстройки:
#include <boost/algorithm/hex.hpp>
std::string s("tralalalala");
std::string result;
boost::algorithm::hex(s.begin(), s.end(), std::back_inserter(result));
Ответ 7
Вы можете попробовать этот код для преобразования байтов из пакета в строку с завершающим нулем и сохранить для переменной "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" имела массив char со строкой "01020e0f".
Ответ 8
Вы можете использовать std:: hex
Eg.
std::cout << std::hex << packet;