मैं बाइट द्वारा चार बफर बाइट में एक हस्ताक्षरित लंबे पूर्णांक की प्रतिलिपि बनाना चाहता हूं। अगर मैं टिप्पणी के तहत लाइन का उपयोग करता हूं, तो इसे बफर में कॉपी नहीं किया जाता है।

    char buf[128];
    //unsigned long int_val = 268435456;
    unsigned long int_val = 293456376;

    cout << "Value of int_val: " << int_val << endl;

    memset(buf, 0, sizeof(buf));

    memcpy(buf, &int_val, sizeof(long));
    cout << "Value after unsigned long int copy - buf: " << buf << endl;

    const int len = strlen(buf);
    cout << "buf" << endl << "====" << endl;
    for (int i = 0; i < len; i++)
    {
        printf("%3d (0x%02X)\n", buf[i], buf[i]);
    }

प्रत्येक मान के साथ दो रन का आउटपुट निम्नलिखित है:

Value of int_val: 268435456
Value after unsigned long int copy - buf:
buf
===

Value of int_val: 293456376
Value after unsigned long int copy - buf: ��}
buf
===
 -8 (0xFFFFFFF8)
-55 (0xFFFFFFC9)
125 (0x7D)
 17 (0x11)
2
Coşkun Deniz 26 अक्टूबर 2020, 13:21

2 जवाब

सबसे बढ़िया उत्तर

हेक्साडेसिमल में, 268435456 1000000016 है। आपका C++ किसी unsigned long के बाइट्स को मेमोरी में कम-वैल्यू बाइट के साथ पहले मेमोरी में स्टोर करता है, इसलिए इसे मेमोरी में बाइट्स के रूप में 0016, 0016< के मान के साथ स्टोर किया जाता है। /उप>, 00<उप>16, 10<उप>16

memcpy इन बाइट्स को buf में सही ढंग से कॉपी करता है।

फिर, जब strlen(buf) buf की जांच करता है, तो उसे पहले एक नल बाइट (0016) मिलती है। यह इंगित करता है कि buf में वर्ण स्ट्रिंग की लंबाई शून्य है, क्योंकि समाप्ति वर्ण शुरुआत में तुरंत दिखाई देता है। तो strlen(buf) शून्य लौटाता है।

चूंकि यह वापसी मान len को सौंपा गया है, लूप for (int i = 0; i < len; i++) शून्य पुनरावृत्तियों को निष्पादित करता है।

इसी तरह, cout << "Value after unsigned long int copy - buf: " << buf << endl; में, buf में शून्य लंबाई की एक स्ट्रिंग होती है, इसलिए इसके लिए कोई वर्ण मुद्रित नहीं किया जाता है।

4
Eric Postpischil 26 अक्टूबर 2020, 13:42

इसे बफर में कॉपी नहीं किया गया है।

हाँ यही है।

cout << ... << buf << endl;
const int len = strlen(buf);

यह स्पष्ट नहीं है कि आपने जो आउटपुट देखा है उसकी अपेक्षा क्यों नहीं की। 0 शून्य टर्मिनेटर वर्ण का मान है। यदि पूर्णांक का निम्नतम मेमोरी ऑर्डर बाइट 0 है, तो बफर में शून्य समाप्त स्ट्रिंग होती है जो खाली स्ट्रिंग का प्रतिनिधित्व करती है। ऐसे मामले में, जो आउटपुट आप देख रहे हैं वह अपेक्षित है। छोटे एंडियन सिस्टम पर (और बड़े एंडियन सिस्टम पर भी जहां long 4 बाइट्स से अधिक चौड़ा है) जो कि 268435456 के मामले में होता है जो हेक्साडेसिमल में 0x10'00'00'00 है।

सिर्फ इसलिए कि आपके द्वारा कॉपी किए गए बाइट खाली स्ट्रिंग का प्रतिनिधित्व करते हैं, इसका मतलब यह नहीं है कि बाइट कॉपी नहीं किए गए थे।

5
eerorika 26 अक्टूबर 2020, 13:57