2015-06-16 3 views
5

मैं स्ट्रिंग (हेक्साडेसिमल) वाली फ़ाइल से List<byte> बनाने की कोशिश कर रहा हूं। परिभाषा है:फ़ाइल से हेक्साडेसिमल जोड़ें <byte>

myArray.Add(0xb8); 

नोट::

List<byte> myArray = new List<byte>(); 

अगर मैं अपने जानकारी जोड़ना चाहते सीधे मैं कुछ इस तरह का उपयोग किसी भी उद्धरण या डबल उद्धरण के बिना।

समस्या तब होती है जब मैं फ़ाइल से वही काम करना चाहता हूं!

0xc3.GetType().ToString() 

परिणाम है:: अब मुझे पता है कि क्या करना 0xb8 के प्रकार इतना है मैं निम्नलिखित कोड का उपयोग करना चाहते System.Int32 !!!!

लेकिन जब मैं किसी फ़ाइल से तार पढ़ता हूं और इस तरह के कोड का उपयोग करता हूं, तो यह मुझे निम्न त्रुटि देता है।

कोड:

Line = "0xb8"; 
myArray.Add(Convert.ToInt32(Line)); 

त्रुटि:

Argument 1: cannot convert from 'int' to 'byte' 

और यह स्पष्ट है। क्योंकि myArray का एकमात्र ओवरलोड केवल byte तर्क के रूप में मिलता है। मेरे लिए चीज इतना जटिल क्यों है, इसलिए Int32myArraymyArray.Add(0xb8); में जब मैं Int32 जोड़ता हूं तो यह मुझे कोई त्रुटि नहीं देता है।

मुझे लगता है कि यह बाइट का एक रूप होना चाहिए! शायद !

यह कोई त्रुटि क्यों नहीं देता है और यह परिदृश्य कैसे पूरा कर सकता है (मेरा मतलब है स्ट्रिंग से myArray में बाइट जोड़ें)?

+0

'परिणाम है: System.Int32 !!!! निश्चित रूप से ... एक संख्या। यह और क्या हो सकता है? – edc65

उत्तर

2

तुम बस byte के लिए मूल्य कास्टिंग द्वारा कि संकलक त्रुटि से छुटकारा पाने के कर सकते हैं:

myArray.Add((byte)Convert.ToInt32(Line)); 

Unhandled Exception: System.FormatException: Input string was not in a correct format.

:

हालांकि, जब आप उस कोड को चलाने आप एक अलग त्रुटि प्राप्त होगी

ऐसा इसलिए है क्योंकि Convert.ToInt32 विधि बॉक्स के बाहर हेक्साडेसिमल संख्याओं को पार्स नहीं करती है।

जब आप एक नंबर करने के लिए स्ट्रिंग में कनवर्ट आप आधार निर्दिष्ट कर सकते हैं:

myArray.Add((byte)Convert.ToInt32(Line, 16)); 
+0

हैं या आप अपने आप को बचाने के लिए और कलाकारों Convert.ToByte (लाइन, 16) का उपयोग कर सकते हैं '' बजाय ... तो अगर आप की एक 'Line' प्रदान करने के लिए होता है" 0xF8C4 "आप एक' OverflowException' बजाय पकड़ कर सकते हैं बस चुपचाप 0xC4 को छंटनी – Sabre

2

How can accomplish this scenario (I mean add byte from string to myArray) ?

List<byte> myArray = new List<byte>(); 
string Line = "0xb8"; 
myArray.Add(Convert.ToByte(Line, 16)); 

why it doesn't give me any error when I add a Int32 to myArray in myArray.Add(0xb8);

संकलक देख सकते हैं कि 0xb8 में Byte मूल्यों की सीमा

myArray.Add(0xb8); // ok 
myArray.Add(0xff); // ok 
myArray.Add(0x100); // cannot convert from int to byte 
4

0xb8 एक पूर्णांक शाब्दिक (जैसे 1234) है। "0xb8" एक स्ट्रिंग शाब्दिक है (जैसे "x")। सी # में हेक्स शाब्दिक जैसी कोई चीज नहीं है। यह हेक्स प्रारूप में एक int शाब्दिक है। तो यह आपके लिए शाब्दिक समस्याओं के बारे में बताता है।

स्ट्रिंग पार्सिंग फ़ंक्शंस में से सभी हेक्स इनपुट का समर्थन नहीं करते हैं। this for how to parse a hex string देखें।

एक पार्स समारोह आप एक int देता है और आप एक byte के रूप में यह इलाज के लिए की जरूरत है, तो आप डाली हो सकते हैं: (byte)myInt। यह सुरक्षित है क्योंकि पार्स किए गए मान को बाइट में फिट करने की गारंटी है।

कुछ स्थानों पर यदि आप 0xb8 जैसे निरंतर उपयोग कर रहे हैं तो कुछ स्थानों में संकलक स्वचालित रूप से आपके लिए रूपांतरित हो सकता है। चूंकि आपके पास अभ्यास में यह नहीं होगा (आप एक फाइल को पार्स कर रहे हैं) यह मामला अंतिम कोड के लिए प्रासंगिक नहीं है। लेकिन यह बताता है कि यह क्यों काम करता है।

+1

उसकी समस्या संकलक ताकि अभिन्न शाब्दिक संकलक ... – xanatos

+0

@xanatos सही से सही प्रकार में बदल दिए जाते में कुछ खुफिया है कि वहाँ है। * कई * बातें यहां व्याख्या करने के लिए! शुरुआत के लिए क्या आश्चर्यजनक रूप से भ्रमित समस्या है। – usr

5

यह काम करता है:

var list = new List<byte>(); 

int byteValue = 0xb8; 
list.Add(byteValue); 
अभी तक दोनों ही मामलों 0xb8 के रूप में मान्यता प्राप्त है में

:

var list = new List<byte>(); 

byte byteValue = 0xb8; 
list.Add(byteValue); 

यह ( " 'बाइट' को 'int' से परिवर्तित नहीं कर सकते") नहीं है System.Int32। तो संकलक पहले उदाहरण में int से byte के अंतर्निहित रूपांतरण की अनुमति क्यों देता है?

सी देखें # कल्पना 6.1.9 अंतर्निहित निरंतर अभिव्यक्ति रूपांतरण:

A constant-expression (§7.19 [including literals]) of type int can be converted to type sbyte, byte, short, ushort, uint, or ulong, provided the value of the constant-expression is within the range of the destination type.

2.4.4.2 पूर्णांक शाब्दिक रूप में विनिर्दिष्ट यह मौजूद है क्योंकि सभी पूर्णांक शाब्दिक या तो (u)int या (u)long कर रहे हैं।

0 <= 0xb8 <= 255 को देखते हुए, संकलक अंतर्निहित रूपांतरण की अनुमति देता है।

आपके मामले में, कारणों explained by @usr की वजह से, आप एक स्पष्ट रूपांतरण करने की आवश्यकता होगी:

myArray.Add((byte)Convert.ToInt32(Line, 16)); 
+2

हाँ, धन्यवाद। आप सही –

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