2012-08-16 35 views
7

Tôi có cấu trúc, con trỏ tới cấu trúc và tôi muốn inf byte đầu tiên dưới dạng số thập phân dài hoặc dưới dạng chuỗi byte hex.Inf dữ liệu thô vào đầu ra hex có độ dài cố định

Về bản chất tôi cần bản in tương đương với lệnh bộ nhớ kiểm tra của gdb, x/nxb.

Nếu có thể tôi vẫn muốn sử dụng printf vì chức năng nhật ký của chương trình chỉ là biến thể của nó. Thậm chí tốt hơn nếu tôi có thể làm như vậy mà không lặp qua dữ liệu.

Trả lời

7

Chỉ cần nghe theo lời khuyên Eric Postpischil và nấu chín lên như sau:

struct mystruc 
{ 
    int a; 
    char b; 
    float c; 
}; 

int main(int argc, char** argv) 
{ 
    struct mystruc structVar={5,'a',3.9}; 
    struct mystruc* strucPtr=&structVar; 
    unsigned char* charPtr=(unsigned char*)strucPtr; 
    int i; 
    printf("structure size : %zu bytes\n",sizeof(struct mystruc)); 
    for(i=0;i<sizeof(struct mystruc);i++) 
     printf("%02x ",charPtr[i]); 

    return 0; 
} 

Nó sẽ in các byte như fas như trải dài cấu trúc.

Cập nhật: Cảm ơn thông tin chi tiết Eric :) Tôi đã cập nhật mã.

+2

Kích thước sẽ được in bằng “% zu”. Đây là định dạng cho loại 'size_t' chưa ký, có thể khác với kiểu' int' đã ký là “% d”. Và có thể thích hợp hơn khi in byte với “% 02x” thay vì “% x”. Bản in thứ hai chỉ in một chữ số nếu giá trị đủ nhỏ. –

1

Hãy thử điều này. Giả sử bạn có con trỏ để cấu trúc trong pstruct.

unsigned long long *aslong = (unsigned long long *)pstruct; 
printf("%08x%08x%08x%08x%08x%08x%08x%08x", 
     aslong[0], 
     aslong[1], 
     aslong[2], 
     aslong[3], 
     aslong[4], 
     aslong[5], 
     aslong[6], 
     aslong[7], 
); 

Như Eric đã chỉ ra, điều này có thể in các byte không đúng thứ tự. Vì vậy, nó hoặc là điều này, hoặc sử dụng unsigned char * và (có một printf với 64 đối số hoặc sử dụng một vòng lặp).

+3

Điều này sẽ sử dụng 'unsigned char'. 'char' có thể được ký, trong trường hợp đó, việc quảng cáo tới' int' xảy ra khi chuyển sang printf sẽ làm cho các giá trị âm xuất hiện dưới dạng giá trị âm 32 bit. Ví dụ: byte 0xff sẽ được in dưới dạng “ffffffff”. Ngoài ra, “% 02x” là định dạng tốt hơn để sử dụng, vì bạn có thể muốn số 0 đứng đầu hơn là dấu cách. –

+0

Vấn đề với giải pháp này là tôi cần phải in 64 byte, thay vì 3. – rhlee

+0

@EricPostpischil: cảm ơn nhận xét. unsigned thực sự là con đường để đi, và '0' là tốt. – Claudiu

Các vấn đề liên quan