web-dev-qa-db-fra.com

Tableau de caractères en chaîne hexagonale C++

J'ai cherché char * dans la chaîne hexagonale avant, mais la mise en œuvre que j'ai trouvée ajoute des déchets non existants à la fin de la chaîne hexagonale. Je reçois des paquets de socket, et j'ai besoin de le convertir en chaîne hexadécimale pour le journal (tampon à terminaison null). Quelqu'un peut-il me conseiller une bonne implémentation pour C++?

Merci!

19
Roman

Supposer que les données sont un caractère *. Exemple de travail utilisant std :: hex:

for(int i=0; i<data_length; ++i)
    std::cout << std::hex << (int)data[i];

Ou si vous voulez tout garder dans une chaîne:

std::stringstream ss;
for(int i=0; i<data_length; ++i)
    ss << std::hex << (int)data[i];
std::string mystr = ss.str();
20

Voici quelque chose:

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
K-ballo

Le plus simple:

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

L'extrait de code ci-dessus fournit un ordre d'octet incorrect dans la chaîne, je l'ai donc corrigé un peu.

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

Vous pouvez essayer ce code pour convertir des octets d'un paquet en une chaîne terminée par un caractère nul et le stocker dans une variable "chaîne" pour le traitement.

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;

Lorsque nous envoyons un message avec les octets hexadécimaux 0x01020E0F, la variable "data" a un tableau de caractères avec la chaîne "01020e0f".

0