2009-08-17 16 views
9

यह सवाल मूल रूप से करने के लिए दूसरी छमाही है मेरे अन्य Questionएक UINT8 सरणी में एक UINT16 मूल्य परिवर्तित [2]

मैं एक UINT16 मूल्य कैसे परिवर्तित कर सकते हैं, एक UINT8 में * एक पाश के बिना सरणी और endian समस्याओं से बचने।

मूल रूप से मैं इस तरह कुछ करना चाहता हूँ:

UINT16 value = 0xAAFF; 
UINT8 array[2] = value; 

इस के अंतिम परिणाम जबकि endian रूपांतरण से आपका बचाव एक UINT8 सरणी में मान संग्रहीत है।

UINT8 * mArray; 
memcpy(&mArray[someOffset],&array,2); 

जब मैं बस UINT16 मूल्य के साथ memcpy करते हैं, यह छोटी-endian जो उत्पादन खंडहर में धर्मान्तरित। मैं एंडियन रूपांतरण कार्यों का उपयोग करने से बचने की कोशिश कर रहा हूं, लेकिन लगता है कि मैं भाग्य से बाहर हो सकता हूं।

उत्तर

25

कैसे

के बारे में
UINT16 value = 0xAAFF; 
UINT8 array[2]; 
array[0]=value & 0xff; 
array[1]=(value >> 8); 

यह एक ही परिणाम endianness के स्वतंत्र वितरित करना चाहिए।

या, आप एक सरणी प्रारंभकर्ता उपयोग करना चाहते हैं:

UINT8 array[2]={ value & 0xff, value >> 8 }; 

(हालांकि, इस केवल तभी संभव है value एक निरंतर है।)

0

UINT16 * करने के लिए एक अस्थायी डाली यह करना चाहिए:

((UINT16*)array)[0] = value; 
+1

यह अभी भी endianness को (मूल रूप से, यह प्रश्न में 'memcpy' के रूप में एक ही बात करता है) संवेदनशील है, क्योंकि यह काम नहीं करता। –

7

सशर्त संकलन के लिए कोई ज़रूरत नहीं है। आप मूल्य के उच्च और निचले बाइट प्राप्त करने के लिए बिट-शिफ्ट कर सकते हैं:

uint16_t value = 0xAAFF; 
uint8_t hi_lo[] = { (uint8_t)(value >> 8), (uint8_t)value }; // { 0xAA, 0xFF } 
uint8_t lo_hi[] = { (uint8_t)value, (uint8_t)(value >> 8) }; // { 0xFF, 0xAA } 

जानवर वैकल्पिक हैं।

+2

प्रश्न टैग सी ++ है, सी ++ कास्ट का उपयोग करें। –

4

यह मानते हुए कि आप उच्च आदेश करना चाहते हैं सरणी में निचले क्रम बाइट ऊपर बाइट:

array[0] = value & 0xff; 
array[1] = (value >> 8) & 0xff; 
+2

मास्क '0xff' अनावश्यक है: 16 से 8 बिट पूर्णांक में रूपांतरण उच्च बाइट ड्रॉप करेगा (हस्ताक्षरित रूपांतरण अच्छी तरह से परिभाषित है!) – Christoph

+2

यह सच है, लेकिन मैं आम तौर पर स्पष्टता के लिए सबकुछ मुखौटा करता हूं। कभी-कभी, मैं 0 से थोड़ा-सा शिफ्ट भी करूंगा ताकि सभी लाइनें मिल जाएंगी और अच्छी तरह से अच्छी लगती हैं। कोई भी अच्छा कंपाइलर अनावश्यक बयान को अनुकूलित करेगा, और यह स्पष्टता के लायक है। – Jonathan

1
union TwoBytes 
{ 
    UINT16 u16; 
    UINT8 u8[2]; 
}; 

TwoBytes Converter; 
Converter.u16 = 65535; 
UINT8 *array = Converter.u8; 
+1

यह अंतहीनता के प्रति संवेदनशील है। – Jonathan

0

मैं देव को इस सूत्र का इस्तेमाल किया एक समाधान है कि कई आकार के सरणियों तक फैला Elop:

UINT32 value = 0xAAFF1188; 
int size = 4; 
UINT8 array[size]; 

int i; 
for (i = 0; i < size; i++) 
{ 
    array[i] = (value >> (8 * i)) & 0xff; 
} 
संबंधित मुद्दे