2012-04-29 4 views
9

Tôi có một mảng gồm 8 byte mà tôi đang cố in ra ký hiệu thập lục phân. Sử dụng printf("%x", array) Tôi có thể nhận được ở byte đầu tiên và in ra nhưng tôi nhận được "0xffffff9b" hoặc thứ gì đó sắp xếp. Có cách nào để có được ký hiệu mà không có chữ "f" không?In biểu diễn thập lục phân của mảng char []

Tôi muốn in ra mỗi phần tử tìm kiếm một cái gì đó như:

0x9a, 0x43, 0x0D vv

+5

Làm cho loại mảng của bạn 'unsigned char [] 'chứ không phải' char [] '. –

+0

http://stackoverflow.com/questions/6357031/how-do-you-convert-buffer-byte-array-to-hex-string-in-c –

Trả lời

16

này:

printf("%x", array); 

sẽ rất có thể in địa chỉ của phần tử đầu tiên của mảng của bạn trong hệ thập lục phân. Tôi nói "rất có thể" vì hành vi cố gắng in một địa chỉ như thể đó là một số unsigned int là không xác định. Nếu bạn thực sự muốn in địa chỉ, đúng cách để làm điều đó sẽ là:

printf("%p", (void*)array); 

(Một biểu thức mảng, trong hầu hết các tình huống, được ngầm chuyển đổi sang ("phân rã" để) một con trỏ đến mảng đầu tiên phần tử.)

Nếu bạn muốn in từng phần tử trong mảng của mình, bạn sẽ phải làm như vậy một cách rõ ràng. Định dạng "%s" lấy con trỏ đến ký tự đầu tiên của chuỗi và yêu cầu printf lặp qua chuỗi, in từng ký tự. Không có định dạng nào thực hiện loại điều đó trong hệ thập lục phân, vì vậy bạn sẽ phải tự làm điều đó.

Ví dụ, đưa ra:

unsigned char arr[8]; 

bạn có thể in nguyên tố 5 như thế này:

printf("0x%x", arr[5]); 

hoặc, nếu bạn muốn có một hàng đầu zero:

printf("0x%02x", arr[5]); 

Định dạng "%x" yêu cầu đối số unsigned int và giá trị unsigned char bạn vượt qua ing được ẩn hoàn toàn được quảng bá đến unsigned int, vì vậy đây là loại chính xác. Bạn có thể sử dụng "%x" để in các chữ số thập phân a qua f trong chữ thường, "%X" cho chữ hoa thường (bạn đã sử dụng cả hai trong ví dụ của mình).

(Lưu ý rằng định dạng "0x%02x" hoạt động tốt nhất nếu byte 8 bit, đó là không bảo đảm, nhưng nó gần như chắc chắn các trường hợp trên bất kỳ hệ thống bạn đang có khả năng để sử dụng.)

Tôi sẽ để lại nó cho bạn để viết vòng lặp thích hợp và quyết định cách phân định đầu ra.

4

Đây là những gì tôi đã làm, nó dễ dàng hơn một chút với chức năng và tôi sử dụng để gỡ lỗi và ghi nhật ký bộ nhớ.

void print_hex_memory(void *mem) { 
    int i; 
    unsigned char *p = (unsigned char *)mem; 
    for (i=0;i<128;i++) { 
    printf("0x%02x ", p[i]); 
    if ((i%16==0) && i) 
     printf("\n"); 
    } 
    printf("\n"); 
} 
+0

Sử dụng "if (i% 16 == 0 && i) "để không ngắt dòng ở lần in đầu tiên. – lsalamon

+0

Đề xuất tuyệt vời! Cảm ơn. – Andy