2010-08-24 10 views
28

pixel_datavectorchar है।हेक्स प्रिंट करते समय printf केवल एक बाइट क्यों मुद्रित नहीं करता है?

मैं 0xf5 देखने की उम्मीद कर रहा हूँ जब मैं printf(" 0x%1x ", pixel_data[0]) है।

लेकिन मैं 0xfffffff5 मिलता है जैसे कि मैं 1 बाइट के बजाय एक 4 बाइट पूर्णांक को प्रिंट किया गया था।

यह क्यों है? मैंने प्रिंट करने के लिए printfchar दिया है - यह केवल 1 बाइट है, तो printf प्रिंटिंग 4 क्यों है?

एनबी। printf कार्यान्वयन को किसी तृतीय पक्ष API के अंदर लपेटा गया है लेकिन यह सोच रहा है कि यह मानक printf की विशेषता है या नहीं?

+2

भी देखें: http://stackoverflow.com/questions/3512749/memcpy-adds-ff-ff-ff-to-the-beginning-of-a-byte –

उत्तर

48

आप शायद अपरिभाषित व्यवहार का एक सौम्य रूप हो रही है क्योंकि %x संशोधक unsigned int पैरामीटर की उम्मीद है और जब एक के लिए पारित एक char आम तौर पर एक int करने के लिए प्रोत्साहित किया जाएगा समारोह varargs।

आप स्पष्ट रूप से उम्मीद के मुताबिक परिणाम प्राप्त करने के लिए एक unsigned int को चार डाली चाहिए:

printf(" 0x%1x ", (unsigned)pixel_data[0]); 

नोट एक क्षेत्र चौड़ाई है कि एक के बहुत उपयोगी नहीं है। यह केवल प्रदर्शित करने के लिए अंकों की न्यूनतम संख्या निर्दिष्ट करता है और किसी भी मामले में कम से कम एक अंक की आवश्यकता होगी।

तो char अपने मंच पर तो हस्ताक्षरित किया गया है इस रूपांतरण बड़े unsigned int मान (उदा fffffff5) के लिए नकारात्मक char मान परिवर्तित कर देंगे। आप pixel_data के लिए unsigned char का उपयोग आप अहस्ताक्षरित मूल्यों के रूप में बाइट मूल्यों का इलाज करना चाहते हैं और सिर्फ विस्तार जब unsigned int को बदलने शून्य हैं चाहिए, या unsigned char के माध्यम से डाली या पदोन्नति के बाद एक मास्किंग आपरेशन का उपयोग करें।

उदा।

printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]); 

या

printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU); 
+0

@charles। स्पष्टीकरण के लिए धन्यवाद क्यों अग्रणी 'एफ' है! मेरे द्वारा उपयोग किए जा रहे तीसरे पक्ष एपीआई में 'हस्ताक्षरित चार' प्रकार है - इसलिए मैंने इसके उपयोग के लिए 'pixel_data' के लिए अपनी परिभाषा बदल दी है और इसके परिणाम मुझे प्राप्त करने के लिए। – BeeBand

+1

@BeeBand: सावधान रहें, बस 'हस्ताक्षरित char' में बदलना पर्याप्त नहीं हो सकता है। अधिकांश प्लेटफॉर्म पर 'हस्ताक्षरित char'' int 'को बढ़ावा देगा, न कि' हस्ताक्षरित int '। –

+0

@ चार्ल्स - जब मैं 'हस्ताक्षरित चार' में नहीं बदलता हूं और केवल कास्ट करता हूं, तो मुझे अभी भी उन अग्रणी एफ मिलते हैं। मुझे लगता है कि मुझे दोनों को 'हस्ताक्षरित int' में बदलने की आवश्यकता है और यह सुनिश्चित करने के लिए कि यह सभी प्लेटफॉर्म पर काम करता है, बिटमैस्क का उपयोग करें। – BeeBand

3

फिर length संशोधक न्यूनतम लंबाई है। printf में

+0

तो 1 न्यूनतम लंबाई है? मैंने सोचा कि लंबाई संशोधक बाइट्स में था। – BeeBand

+3

यह वर्णों में लंबाई है। – leppie

+0

क्षमा करें, मुझे समझ में नहीं आता कि आपका क्या मतलब है। ऐसा क्यों होता है कि 'लंबाई' संशोधक न्यूनतम लंबाई है? – BeeBand

2

चौड़ाई-विनिर्देशक वास्तव में न्यूनतम-चौड़ाई है। pixel_data[0] उदाहरण के लिए है, तो आप कम से कम दो अक्षर मुद्रित करने के लिए printf(" 0x%2x ", pixel_data[0] & 0xff) कर सकते हैं (नोटिस 2, वास्तव में दो वर्णों को मुद्रित करने के लिए)।

7

बेहतर उपयोग मानक प्रारूप-झंडे

printf(" %#1x ", pixel_data[0]); 

फिर अपने संकलक आप के लिए हेक्स-उपसर्ग डालता है।

+0

शानदार! यह जानने के कारण, मैंने डीबगर का उपयोग किया ... – Tebe

3

उपयोग %hhx

printf("%#04hhx ", foo); 
+0

दुख की बात है कि मैं 'printf' के किसी तृतीय पक्ष API कार्यान्वयन का उपयोग कर रहा हूं जो 'hh' formatter को अनुमति नहीं देता है। लेकिन इसके बारे में जानना अच्छा है - धन्यवाद। – BeeBand

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