2010-03-04 26 views
5

मैं एक एम्बेडेड यूएसबी प्रोजेक्ट के लिए फर्मवेयर पर काम कर रहा हूं। मैं जिस उत्पादन प्रोग्रामर का उपयोग करना चाहता हूं वह स्वचालित रूप से एक निर्दिष्ट स्मृति पते पर डिवाइस फ्लैश मेमोरी में सीरियल नंबर लिखता है। प्रोग्रामर सीरियल नंबर को एक निश्चित संख्या में बाइट्स में हेक्स अंकों के रूप में संग्रहीत करता है। उदाहरण के लिए, अगर मैं इसे बता पते पर सीरियल नंबर 123456 स्टोर करने के लिए 0x3C00 मेरी स्मृति इस तरह दिखता है:मैं एक पूर्णांक को सी में यूनिकोड स्ट्रिंग में कैसे परिवर्तित कर सकता हूं?

0x3C00 - 00 
0x3C01 - 01 
0x3C02 - E2 
0x3C03 - 40 
//(123456 in Hex = 1E240) 

समस्या है, जब मेरे मेजबान आवेदन डिवाइस से सीरियल नंबर पढ़ता है यह एक यूनिकोड की तलाश में है चार सरणी तो मेरी सीरियल नंबर होना चाहिए ...

{ '1','0', 
    '2','0', 
    '3','0', 
    '4','0', 
    '5','0', 
    '6','0'} 

जब

मेरी फर्मवेयर, जो मैं सी में लिख रहा हूँ में

इसलिए, यह फ्लैश से हेक्स सीरियल नंबर को पुनः प्राप्त करने, में यह सांकेतिक शब्दों में बदलना संभव है एक यूनिकोड चार सरणी और राम में एक चर में स्टोर?

+0

मुझे लगता है कि नमूना सरणी 'पढ़ना चाहिए ushort [] धारावाहिक = { '1', '2' , '3', '4', '5', '6'} ' –

+0

क्या हम मान सकते हैं कि आपका सी कंपाइलर यूनिकोड को समझता है? –

उत्तर

2

यदि सीरियल नंबर 32 बिट्स में फिट बैठता है और प्लेटफॉर्म बड़ा एंडियन है और यूनिकोड, 32 बिट इन्ट्स और मानक सी लाइब्रेरीज़ का समर्थन करता है तो यह अन्य सीधा दिखाए जाने के साथ बहुत सरल है। यदि प्लेटफॉर्म में 32 बिट इन्ट्स और 8 बिट वर्ण हैं लेकिन थोड़ा एंडियन है और/या यूनिकोड का समर्थन नहीं करता है, और यदि सीरियल नंबर लंबाई में भिन्न हो सकता है, तो नीचे उपयोगी हो सकता है, हालांकि यह थोड़ा काम करने वाला है।

void extract_serial_number(unsigned char* address, unsigned int bytes, char* buffer) { 
    unsigned int value = 0; 
    char c, *start = buffer; 
    while (bytes--) {      /* read the serial number into an integer */ 
     value = value << 8; 
     value |= *address++; 
    } 
    while (value > 0) {     /* convert to 16 bit Unicode (reversed) */ 
     *buffer++ = '0' + value % 10; 
     *buffer++ = '\0'; 
     value /= 10; 
    } 
    *buffer++ = '\0'; 
    *buffer++ = '\0'; 
    buffer -= 4; 
    while (buffer > start) {    /* reverse the string */ 
     c = *buffer; 
     *buffer = *start; 
     *start = c; 
     buffer -= 2; 
     start += 2; 
    } 
} 
3

आप कुछ इस तरह उपयोग करने के लिए सक्षम होना चाहिए:

wchar_t buf[10]; 
swprintf(buf, L"%d", your_int_value); 

विवरण सी क्रम पुस्तकालय के लिए अपने सटीक क्रियान्वयन के आधार पर भिन्न हो सकते हैं। उदाहरण के लिए, अपने swprintf()buf में वर्णों की संख्या अपेक्षा कर सकते हैं:

swprintf(buf, sizeof(buf)/sizeof(buf[0]), L"%d", your_int_value); 
+0

मुझे संदेह है कि फर्मवेयर – Andrey

+0

में यह संभव है क्योंकि यह 32 बिट नंबर है, आपको% d के बजाय% ld का उपयोग करना होगा। – semaj

+0

@ एंड्री: फर्मवेयर सिर्फ दूसरे नाम के साथ सॉफ्टवेयर है। फर्मवेयर में व्यापक रनटाइम लाइब्रेरी उपलब्ध हो सकती हैं। –

4

ऐसा लगता है कि आप की तरह हैं:

wsprintf(wchar_buffer, L"%d", serial_number) 

(यह सोचते हैं कि अपने सीरियल नंबर एक 32-बिट पूर्णांक में फिट बैठता है किसी भी में। मामले, wsprintf एक wchar (यूनिकोड) स्ट्रिंग के रूप में अपने सीरियल नंबर प्रिंट होगा।

+0

'wchar_t' जरूरी नहीं है कि 16 बिट यूसीएस 2 (यह बिल्कुल यूनिकोड भी आवश्यक नहीं है)। – caf

+0

सच है, लेकिन अगर ऐसा है तो आपको बड़ी समस्याएं हैं। आपको यह निर्धारित करने के लिए अपने कंपाइलर के दस्तावेज़ों को पढ़ने में सक्षम होना चाहिए कि क्या 'wchar_t' में आपके द्वारा आवश्यक आकार का आकार है (और यदि नहीं, तो ध्वज कैसे सेट करें ताकि' wchar_t' जो आप चाहते हैं)। –

+0

क्या आप समझा सकते हैं कि एल का क्या अर्थ है? – SeanLetendre

2

यकीन नहीं है कि इस कोड अपने डिवाइस फिट होगा, लेकिन कोशिश करते हैं

char buffer[MAX_SIZE]; 
char unicodeBuffer[MAX_SIZE]; 
sprintf(buffer, "%d", i); 
int len = strlen(buffer); 
int i = 0; 
for (int i = 0; i <= (len << 1) - 2; i++) 
    unicodeBuffer[i] = i % 2 ? buffer[i] : 0; 
unicodeBuffer[i + 1] = 0; 
unicodeBuffer[i + 2] = 0; 
+0

यह काम नहीं करता है - यह केवल 'sprintf' द्वारा बनाए गए बफर से वर्णों में से आधे की प्रतिलिपि बना रहा है। – caf

2

आप अपने एम्बेडेड वातावरण में sprintf के लिए उपयोग किया है, तो इस काम करना चाहिए:

#define MAX_SIZE(type) ((CHAR_BIT * sizeof(type) - 1)/3 + 2) 

/* Destination UCS2 buffer size must be at least 2*MAX_SIZE(int) */ 
void int_to_ucs2(char *dest, int q) 
{ 
    char buffer[MAX_SIZE(q)]; 
    char *src = buffer; 

    sprintf(buffer, "%d", q); 

    do { 
     *dest++ = *src; 
     *dest++ = 0; 
    } while (*src++); 
}