2011-06-16 8 views
8

मेरे पास एक बाइट सरणी है, और मैं इस सरणी से एक पूर्णांक पढ़ना चाहता हूं। मैं यह कैसे कर सकता हूं?बाइट से एक पूर्णांक को कैसे पढ़ा जाए []

कुछ इस तरह:

int i; 

tab = new byte[32]; 

i = readint(tab,0,3); // i = int from tab[0] to tab[3] (int = 4 bytes?) 

i = readint(tab,4,7); 

आदि ...

उत्तर

14
byte[] bytes = { 0, 0, 0, 25 }; 

// If the system architecture is little-endian (that is, little end first), 
// reverse the byte array. 
if (BitConverter.IsLittleEndian) 
    Array.Reverse(bytes); 

int i = BitConverter.ToInt32(bytes, 0); 
Console.WriteLine("int: {0}", i); 

रेफरी: How to: Convert a byte Array to an int

+1

हालांकि प्रदर्शन के अनुसार, हर बार सरणी को उलटने के बजाय बिग एंड लिटिल एंडियन के लिए दो अलग-अलग कक्षाएं बेहतर होंगी। इसके अलावा, चूंकि ओपी के मूल प्रश्न में 4 इन्स की एक सरणी है, इसलिए व्यक्तिगत 4-बाइट शब्दों को उलटना होगा। और चूंकि सिस्टम आर्किटेक्चर अग्रिम में जाना जाता है, ओओपी दृष्टिकोण अधिक समझ में आता है। – Groo

+0

@ ग्रूओ: पोस्टर के कोड स्निपेट में 4 बाइट्स –

3

आप BitConverter.ToInt32 इस्तेमाल कर सकते हैं। this पर एक नज़र डालें।

2

यदि आप इसे मैन्युअल रूप से करना चाहते हैं, तो ऐसा कुछ चाल करना चाहिए!

byte[] data = ...; 
int startIndex = 0; 
int value = data[startIndex]; 

for (int i=1;i<4;i++) 
{ 
    value <<= 8; 
    value |= data[i+startIndex]; 
} 
5

इसके अलावा, वहाँ एक कक्षा में Endian कहा जाता है जॉन स्कीट के miscutil library जो एक बाइट सरणी और विभिन्न आदिम प्रकार, खाते में endianness लेने के बीच रूपांतरण तरीकों लागू करता है।

// Input data 
byte[] tab = new byte[32]; 

// Pick the appropriate endianness 
Endian endian = Endian.Little; 

// Use the appropriate endian to convert 
int a = endian.ToInt32(tab, 0); 
int b = endian.ToInt32(tab, 4); 
int c = endian.ToInt32(tab, 8); 
int d = endian.ToInt32(tab, 16); 
... 

एन्डियन वर्ग का एक सरलीकृत संस्करण होगा कुछ की तरह:

public abstract class Endian 
{ 
    public short ToInt16(byte[] value, int startIndex) 
    { 
     return unchecked((short)FromBytes(value, startIndex, 2)); 
    } 

    public int ToInt32(byte[] value, int startIndex) 
    { 
     return unchecked((int)FromBytes(value, startIndex, 4)); 
    } 

    public long ToInt64(byte[] value, int startIndex) 
    { 
     return FromBytes(value, startIndex, 8); 
    } 

    // This same method can be used by int16, int32 and int64. 
    protected virtual long FromBytes(byte[] buffer, int startIndex, int len); 
} 

और फिर FromBytes सार विधि के लिए अलग तरह से कार्यान्वित किया जाता है

अपने प्रश्न के लिए, उपयोग की तरह कुछ होगा प्रत्येक एंडियन प्रकार।

public class BigEndian : Endian 
{ 
    protected override long FromBytes(byte[] buffer, int startIndex, int len) 
    { 
     long ret = 0; 
     for (int i=0; i < len; i++) 
     { 
      ret = unchecked((ret << 8) | buffer[startIndex+i]); 
     } 
     return ret; 
    } 
} 

public class LittleEndian : Endian 
{ 
    protected override long FromBytes(byte[] buffer, int startIndex, int len) 
    { 
     long ret = 0; 
     for (int i=0; i < len; i++) 
     { 
      ret = unchecked((ret << 8) | buffer[startIndex+len-1-i]); 
     } 
     return ret; 
    } 
} 
+0

की एक सरणी है, मुझे लगता है कि अगर यह पूर्णांक से बाइट्स बनाने के लिए कुछ कोड भी था तो यह बहुत अच्छा होगा। अन्यथा (ज्यादातर मामलों में) कोई व्यक्ति उस भाग का अनुमान लगाए बिना इस कोड का उपयोग नहीं कर सकता है। :( – user2173353

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