2012-03-27 24 views
6

मैं एक आईडी 3 टैग में पढ़ रहा हूं जहां प्रत्येक फ्रेम का आकार 3 बाइट्स में निर्दिष्ट है। मैं इस मूल्य का उपयोग int के रूप में कैसे कर पाऊंगा?सी 3+ में एक पूर्णांक के रूप में आप 3 बाइट आकार मान में कैसे पढ़ते हैं?

+1

"पढ़ने" का क्या अर्थ है? याद से? एक फाइल से? –

+1

सी में आप int बिटिंग 3 बाइट्स = 3 * 8 = 24 बिट्स के रूप में टाइप किए गए बिट फ़ील्ड नामक कुछ का उपयोग कर सकते हैं। सी में, यह 'int int_3byte: 24' (एक संरचना के अंदर) द्वारा दर्शाया गया है। मुझे लगता है कि सी ++ के लिए इसके बराबर तंत्र है। – phimuemue

+2

कृपया बिटफील्ड का उपयोग न करें। –

उत्तर

9

प्रत्येक बाइट पढ़ें और फिर अपने int में एक साथ डाल:

int id3 = byte0 + (byte1 << 8) + (byte2 << 16); 

खाते में endianness लेने के लिए सुनिश्चित करें।

+0

'+' या '|'? [..] – Muggen

+1

कोई फर्क नहीं पड़ता, वे इस मामले में एक ही हैं। –

+0

उत्कृष्ट, धन्यवाद – carboncomputed

5

व्यक्तिगत रूप में बाइट्स पढ़ें, और उन्हें किसी पूर्णांक में सही स्थानों में डाल दिया:

int value = 0; 

unsigned char byte1 = fgetc(ID3file); 
unsigned char byte2 = fgetc(ID3file); 
unsigned char byte3 = fgetc(ID3file); 

value = (byte1 << 16) | (byte2 << 8) | byte3; 

संपादित करें: ऐसा लगता है कि ID3 नेटवर्क (बड़े endian) बाइट क्रम का उपयोग करता है - मैच के लिए कोड बदल दिया है।

+0

यह मानता है कि' char' है हस्ताक्षरित ... (इसके अलावा, 'fgetc'' int 'देता है!) –

+0

@OliCharlesworth: fgetc एक int देता है, लेकिन केवल एक ही मान जो नकारात्मक हो सकता है (एक int के रूप में) ईओएफ जैसी चीजें हैं (जिन्हें मैं अनदेखा कर रहा हूं क्षण)। –

+2

सी ++ लोग शायद 'fgetc()' का उपयोग करने से नफरत करते हैं, लेकिन मैं जैरी के साथ हूं। –