2012-08-16 18 views
7

मेरे पास एक संरचना है, एक संरचना के लिए अच्छी तरह से सूचक है, और मैं पहले एन बाइट्स को लंबे हेक्स नंबर के रूप में प्रिंट करना चाहता हूं, या हेक्स बाइट्स की स्ट्रिंग के रूप में प्रिंट करना चाहता हूं।प्रिंटफ कच्चे डेटा को एक निश्चित लंबाई हेक्स आउटपुट

अनिवार्य रूप से मुझे gdb की test memory कमांड, x/nxb के बराबर printf की आवश्यकता है।

यदि संभव हो तो मैं अभी भी प्रिंटफ का उपयोग प्रोग्राम के लॉगर फ़ंक्शन के रूप में करना चाहता हूं। इससे भी बेहतर अगर मैं डेटा के माध्यम से लूपिंग के बिना ऐसा कर सकता हूं।

उत्तर

7

बस एरिक Postpischil की सलाह मान ली और ऊपर पकाया निम्नलिखित:

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

यह संरचना हिस्सों के रूप में FAS के रूप में बाइट्स प्रिंट होगा।

अद्यतन: अंतर्दृष्टि एरिक के लिए धन्यवाद :) मैंने कोड अपडेट किया है।

+2

को स्पष्ट करने के लिए अपडेट किया जाएगा आकार "% zu" के साथ मुद्रित किया जाना चाहिए। यह हस्ताक्षरित 'size_t' प्रकार का प्रारूप है, जो"% d "के हस्ताक्षरित 'int' प्रकार से अलग हो सकता है। और "% x" के बजाय "% 02x" के साथ बाइट प्रिंट करना बेहतर हो सकता है। उत्तरार्द्ध केवल एक अंक प्रिंट करता है यदि मान पर्याप्त छोटा है। –

1

इसे आजमाएं। मान लें कि आपके पास 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], 
); 

एरिक बताते हैं, यह बाइट्स बाहर के आदेश प्रिंट हो सकता है। तो यह या तो है, या unsigned char * का उपयोग कर रहा है और (6412 तर्कों के साथ या एक लूप का उपयोग कर printf)।

+3

इसे 'हस्ताक्षरित चार' का उपयोग करना चाहिए। 'char' पर हस्ताक्षर किए जा सकते हैं, इस मामले में printf को गुजरने पर होने वाली 'int' को पदोन्नति नकारात्मक मानों को 32-बिट नकारात्मक मानों के रूप में दिखाई देगी। उदाहरण के लिए, बाइट 0xff को "ffffffff" के रूप में मुद्रित किया जाएगा। इसके अतिरिक्त, "% 02x" उपयोग करने के लिए एक बेहतर प्रारूप है, क्योंकि आप संभवतः रिक्त स्थान की बजाय शून्य शून्य चाहते हैं। –

+0

इस समाधान के साथ समस्या यह है कि मुझे 3. – rhlee

+0

@EricPostpischil के बजाय 64 बाइट्स प्रिंट करने की आवश्यकता है: टिप्पणियों के लिए धन्यवाद। हस्ताक्षर किए जाने का तरीका वास्तव में जाने का तरीका है, और '0' भी। – Claudiu

संबंधित मुद्दे