2010-04-22 16 views
6

आप किसी भी संरचना को छोटे-एंडियन वाले प्रोसेसर पर बाइट सरणी में कैसे परिवर्तित करेंगे?संरचना को बाइट्स में कनवर्ट करें

+2

कृपया अपने अनुरोध पर विस्तार करें - और ध्यान दें कि आपका उत्तर अत्यंत प्रोसेसर आर्किटेक्चर निर्भर होगा – KevinDTimm

+0

थोड़ा एंडियन के लिए एड्रेसिंग यूनिट क्या है? आप वास्तव में क्या करने की कोशिश कर रहे हैं? – WhirlWind

उत्तर

11

आप C++ वस्तु के किसी भी प्रकार का उपयोग करने की, तो एक char* उपयोग कर सकते हैं:

struct S 
{ 
    int a; 
    int b; 
    // etc. 
}; 

S my_s; 

char* my_s_bytes = reinterpret_cast<char*>(&my_s); 

// or, if you prefer static_cast: 
char* my_s_bytes = static_cast<char*>(static_cast<void*>(&my_s)); 

(वहाँ reinterpret_cast बनाम static_cast के सही होने में कम से कम some debate है; व्यवहार में यह वास्तव में कोई फर्क नहीं पड़ता - दोनों को एक ही परिणाम मिलना चाहिए)

+0

:-) सी ++ पर अब भी कई भाषा सुधार। पहले, यह पर्याप्त होगा: 'char * b = (char *) &my_s; 'शायद अगर मैं फिर से सी ++ सीखता हूं, तो मैं उन कलाकारों के बारे में कुछ पढ़ूंगा। –

+3

@ माइकल: उस सी-स्टाइल कास्ट इस मामले में 'reinterpret_cast' जैसा ही है, क्योंकि' static_cast' और 'const_cast' का कोई संयोजन मान्य नहीं है। सी ++ शैली का उपयोग करने से गारंटी मिलती है कि आप जिस कलाकार का इरादा रखते हैं उसे प्राप्त करें; सी-स्टाइल कास्ट मूल रूप से केवल पांच अलग-अलग प्रकार के कास्टों का अनुक्रम करने की कोशिश करता है जब तक कि यह काम न करे। –

+0

उत्तर आपके द्वारा निर्दिष्ट संरचना को सही है। हालांकि, वहां कुछ शॉर्ट्स, big_integers, या चरित्र डेटा फेंक दें और यह बहुत गलत है। –

5
I like to use a union. 

typedef struct b { 
    unsigned int x; 
    unsigned int y; 
} b_s; 

typedef union a { 
    b_s my_struct; 
    char ary[sizeof(b_s)]; 
} a_u; 
+1

क्यों न केवल 'आर्य [आकार (बी)] '? –

+0

@Rob मेला पर्याप्त ... बदल गया। – WhirlWind

2
(char*)&someStruct 
+1

खैर ... 'char',' बाइट' नहीं। – Blindy

+0

# डिफाई बाइट (हस्ताक्षरित चार) –

2

आप क्या करने की कोशिश कर रहे हैं? यदि आप संरचना को क्रमबद्ध करने की कोशिश कर रहे हैं ताकि आप इसे किसी फ़ाइल में सहेज सकें या किसी संदेश में पास कर सकें, तो आप boost::serialization जैसे किसी टूल का उपयोग करके बेहतर हो सकते हैं।

तुम सिर्फ बाइट्स की एक सरणी आप reinterpret_cast<char*> के रूप में दूसरों का उल्लेख किया है, या कर सकता है चाहते हैं:

MyStruct s; 
char [] buffer = new char[sizeof(s)]; 
memcpy(&buffer, &s, sizeof(s)); 
1

मैं void* में झाँकने होगा।

struct gizmo 
{ 
//w/e 
}; 

//stuff 

gizmo *G = new gizmo; 

void* bytearray = (void*)G; 

आपकी संरचना कैसे पैक की जाती है अस्पष्ट है और संकलक, एबीआई और सीपीयू पर निर्भर करती है। आपको अपने मैनुअल & कुछ असेंबली पढ़ने से इसे समझना होगा।

+1

आप एक शून्य * – nos

+0

@nos के माध्यम से बाइट्स तक नहीं पहुंच सकते हैं: कृपया विस्तार करें। –

+0

चूंकि आप एक शून्य * को अस्वीकार नहीं कर सकते हैं, इसलिए आप जो कुछ भी इंगित करते हैं, उस पर आप इसका उपयोग नहीं कर सकते हैं (संभवतः मेमकी का उपयोग करके बार, जिस स्थिति में मध्यवर्ती शून्य * की आवश्यकता नहीं है) foo [0]; अगर foo एक शून्य * है तो एक कंपाइलर त्रुटि है। व्यक्तिगत बाइट्स तक पहुंचने के लिए एक हस्ताक्षरित char * का उपयोग करें। – nos

0

इन सभी उत्तरों के साथ समस्या यह है कि आप वास्तव में डेटा के बारे में कुछ जानने के बिना बेवकूफ बाइट स्वैपिंग नहीं कर सकते हैं। चरित्र डेटा स्वैप हो जाता है। 64-बिट पूर्णांकों को अलग-अलग प्रकार के स्वैपिंग की आवश्यकता होती है, इस पर निर्भर करता है कि प्रश्न में दो प्रोसेसर ने उन्हें कैसे लागू किया।

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