2012-05-23 64 views
15

Tôi đã tìm kiếm char * thành chuỗi hex trước nhưng thực hiện tôi tìm thấy thêm một số rác không tồn tại ở cuối chuỗi hex. Tôi nhận được các gói từ socket, và tôi cần phải chuyển đổi nó thành chuỗi hex cho log (null-chấm dứt buffer). Ai đó có thể tư vấn cho tôi một sự imple tốt cho C + +?Mảng Char vào chuỗi hex C++

Cảm ơn!

+1

Chính xác bạn ngụ ý gì bởi chuỗi thập lục phân? –

+0

Bạn đã cố khắc phục việc triển khai chưa? Bạn có thể đăng bài thực hiện và một số đầu vào/đầu ra không? – dirkgently

+1

"thêm một số rác không tồn tại ở cuối chuỗi hex" - có thể bạn đang chuyển một bộ đệm không null vào một hàm mong đợi LPSTR. Không phải mọi thứ char * đều là một chuỗi. –

Trả lời

7

Dưới đây là một cái gì đó:

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

Bạn có thể sử dụng std::hex

Ví dụ.

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

Tôi không biết bạn nghĩ gì về 'std: : hex' thay đổi cho 'char *' đầu ra, nhưng bạn nên xây dựng một bản demo làm việc. –

7

Cách đơn giản nhất:

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

tôi nghĩ rằng nó không hoạt động với null-chấm dứt dây – Roman

+1

Tại sao không? Nó hoạt động chính xác đối với chuỗi đã kết thúc null ('* p'). – demi

+3

Điều này * chỉ * hoạt động cho các chuỗi kết thúc. Rất có thể, nó sẽ chỉ cho anh ta một vấn đề tương tự khiến anh ta đặt câu hỏi của anh ta. –

2

đoạn mã trên đây cung cấp thứ tự byte không chính xác trong chuỗi, vì vậy tôi cố định nó một chút.

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

Điều này có thể là bình luận cho câu trả lời của K-ballo hoặc phải là câu trả lời (và bạn có thể đề cập đến vấn đề bạn đã khắc phục). Vui lòng chỉnh sửa. – dirkgently

11

Giả sử dữ liệu là char *. Ví dụ làm việc sử dụng std :: hex:

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

Hoặc nếu bạn muốn giữ nó tất cả trong một chuỗi:

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

Bạn phải sử dụng std: setfill và std :: setw để chuyển đổi chính xác. xem: http://stackoverflow.com/a/7639754/1731454 – oferei

0

Bạn có thể thử mã này để chuyển đổi byte từ gói thành một chuỗi null-terminated và lưu vào biến "chuỗi" để xử lý.

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; 

Khi chúng tôi gửi thư có byte hex 0x01020E0F, biến "dữ liệu" có mảng char có chuỗi "01020e0f".