web-dev-qa-db-ja.com

16進文字列C ++へのChar配列

私は検索しました char*を前にhex文字列に追加しましたが、実装はhex文字列の最後に存在しないガベージを追加しました。ソケットからパケットを受信し、それらをログ用のhex文字列(nullで終わるバッファ)に変換する必要があります。誰かが私にC++

ありがとう!

20
Roman

データが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();

ここに何かあります:

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 ];
}
11
K-ballo

もっとも単純な:

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

上記のコードスニペットでは、文字列のバイト順序が正しくないため、少し修正しました。

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
Tomas

ブーストの使用:

#include <boost/algorithm/hex.hpp>

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

ここで良い例を見つけました 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を使用して、値を16進数で表します
std::setwstd::setfillおよび<iomanip>を使用してフォーマットします
最下位バイトを表示するには、0xffに対してキャストintをマスクする必要があることに注意してください。
(0xff & (unsigned int)el)

それ以外の場合、最上位ビットが設定されていると、キャストの結果、3つの最上位バイトがffに設定されます。

0

バイトをパケットからヌル終了文字列に変換し、処理のために「文字列」変数に保存するためにこのコードを試すことができます。

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;

16進バイト0x01020E0Fでメッセージを送信すると、変数 "data"には文字列 "01020e0f"のchar配列がありました。