2011-11-12 15 views
5

में हस्ताक्षर किए पूर्णांक में 3 बाइट्स परिवर्तित।मैं पर हस्ताक्षर किए पूर्णांक (बिग-endian) सी # में करने के लिए 3 बाइट्स कन्वर्ट करने के लिए कोशिश कर रहा हूँ सी #

मैं BitConverter.ToInt32 विधि का उपयोग करने की कोशिश की है, लेकिन मेरी समस्या क्या मूल्य लाट्स बाइट होना चाहिए।

क्या कोई मुझे सुझाव दे सकता है कि मैं इसे अलग तरीके से कैसे कर सकता हूं?

मैं भी (या 7 या 6) लंबे हस्ताक्षर किए के लिए बाइट्स, वहाँ किसी भी सामान्य नियम है कि यह कैसे करना है 5 बदलने की आवश्यकता?

किसी भी मदद के लिए अग्रिम धन्यवाद।

+1

साइन और परिमाण? दो का अनुपूरण? – Ani

+0

यह दो पूरक में है –

उत्तर

8

एक अंतिम उपाय के रूप में आप हमेशा बदलाव कर सकता है + अपने आप को जोड़:

byte b1, b2, b3; 

int r = b1 << 16 | b2 << 8 | b3; 

बस स्वैप बी 1/बी 2/बी 3 जब तक आप वांछित परिणाम नहीं है।

दूसरे विचार पर, यह कभी भी नकारात्मक मूल्यों का उत्पादन नहीं करेगा।
msb> = 0x80 जब आप क्या परिणाम चाहते हैं?


भाग 2, जानवर बल पर हस्ताक्षर विस्तार: कई p के लिए

 byte[] bytes = BitConverter.GetBytes(p); 
     int r = Bytes2Int(bytes[2], bytes[1], bytes[0]); 
     Console.WriteLine("{0} == {1}", p, r); 

:

private static int Bytes2Int(byte b1, byte b2, byte b3) 
    { 
     int r = 0; 
     byte b0 = 0xff; 

     if ((b1 & 0x80) != 0) r |= b0 << 24; 
     r |= b1 << 16; 
     r |= b2 << 8; 
     r |= b3; 
     return r; 
    } 

मैं के साथ इस परीक्षण किया है।

+0

ठीक किया है, लेकिन मुझे नकारात्मक मानों की भी आवश्यकता है –

+0

ठीक है, सहायता के लिए धन्यवाद। मेरा आखिरकार समाधान थोड़ा अलग है, लेकिन यह निर्धारित करने के लिए कि क्या संख्या सकारात्मक या नकारात्मक है, मैं सबसे महत्वपूर्ण बिट (बी 1 और 0x80) की जांच तंत्र का भी उपयोग करता हूं। –

+0

@ vc.one, हाँ, संपादन के लिए धन्यवाद। '+ 'की भी आवश्यकता है'() ':' (बी 1 << 16) + ... ' –

4

अंतिम मान 0 होना चाहिए अगर यह एक सकारात्मक संख्या, 256 एक नकारात्मक के लिए के लिए सेट नहीं है।

पता करने के लिए क्या आप में पास करना चाहिए, तो आप इसे दूसरी तरह परिवर्तित करने की कोशिश कर सकते हैं:

var bytes = BitConverter.GetBytes(i); 
int x = BitConverter.ToInt32(bytes, 0); 
+0

जोड़ना 0 गलत है यदि कनवर्टिंग नंबर में शून्य चिह्न –

+0

@RafalSpacjer ने इसे –

0

यहां मौजूदा उत्तर देने के लिए जोड़ने के लिए, वहाँ है कि Bitconverter.ToInt32() में पकड़ लिया का एक सा एक ArgumentException फेंक देंगे अगर सरणी से भी कम समय sizseof(int) (4) आकार में बाइट है;

गंतव्य सरणी संग्रह में सभी वस्तुओं की प्रतिलिपि बनाने के लिए पर्याप्त नहीं है। सरणी सूचकांक और लंबाई की जांच करें।

आकार में sizeof(int) (4) बाइट से कम एक सरणी को देखते हुए, आप बाएं/दाएं पैडिंग की क्षतिपूर्ति कर सकते हैं;

राइट-पैड

सकारात्मक Int32 संख्या

int intByteSize = sizeof(int); 
byte[] padded = new byte[intByteSize]; 
Array.Copy(sourceBytes, 0, padded, 0, sourceBytes.Length); 
sourceBytes = padded; 

वाम-पैड नकारात्मक Int32 संख्या में

परिणाम, यह मानते हुए बाइट सूचकांक sourceBytes.Length - 1 पर गैर शून्य मान में परिणाम।

int intByteSize = sizeof(int); 
byte[] padded = new byte[intByteSize]; 
Array.Copy(sourceBytes, 0, padded, intByteSize - sourceBytes.Length, sourceBytes.Length); 
sourceBytes = padded; 

एक बार गद्देदार, आप सुरक्षित रूप int myValue = BitConverter.ToInt32(sourceBytes, 0); कॉल कर सकते हैं।