2012-05-23 9 views
15

Szukałem znaku * na szesnastkowym łańcuchu przed wprowadzeniem, ale implementacja znalazła dodanie niektórych nieistniejących śmieci na końcu ciągu szesnastkowego. Otrzymuję pakiety z gniazda i muszę przekonwertować je na łańcuch szesnastkowy dla log (bufor zakończony zerem). Czy ktoś może mi doradzić dobrą implementację C++?Tablica znaków na łańcuch szesnastkowy C++

Dzięki!

+1

Co dokładnie masz na myśli przez ciąg szesnastkowy? –

+0

Czy próbowałeś naprawić implementację? Czy możesz opublikować implementację i niektóre wejścia/wyjścia? – dirkgently

+1

"dodaje niektóre nieistniejące śmieci na końcu łańcucha szesnastkowego" - prawdopodobnie przekazujesz niezerowy bufor zakończony do funkcji spodziewającej się LPSTR. Nie wszystko char * to ciąg znaków. –

Odpowiedz

7

Oto coś:

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

Można użyć std::hex

Np.

std::cout << std::hex << packet; 
+5

Nie wiem, co myślisz 'std: : zmiany hex dla 'char *' wyjścia, ale powinieneś zbudować działające demo. –

7

Najprostszy: powyżej

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

Myślę, że to nie działa z zakończonymi znakiem NUL ciągami – Roman

+1

Dlaczego nie? Działa dokładnie dla łańcucha zakończonego zerem ('* p'). – demi

+3

Ten * tylko * działa dla łańcuchów nul-terminate. Najprawdopodobniej po prostu da mu ten sam problem, który skłonił go do zadania pytania. –

2

Fragment kodu zawiera nieprawidłową kolejność bajtów w ciąg, więc naprawiłem go trochę.

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

Może to być komentarz do odpowiedzi K-ballo lub powinien być odpowiedzią (możesz wspomnieć o rozwiązanym problemie). Edytuj. – dirkgently

11

Przyjmowanie danych to znak *. przykład pracę przy użyciu std :: hex:

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

Lub jeśli chcesz utrzymać to wszystko w ciągu znaków:

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

Musisz użyć std: setfill i std :: setw, aby przekonwertować poprawnie. patrz: http://stackoverflow.com/a/7639754/1731454 – oferei

0

można wypróbować ten kod do konwertowania bajtów z pakietu na ciąg nul i przechowuj do zmiennej "string" do przetwarzania.

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; 

Kiedy wysłać wiadomość z hex bajtów 0x01020E0F, zmienne "dane" miał char tablicę z ciągiem "01020e0f".

Powiązane problemy