2010-04-17 19 views
10

पर कनवर्ट करें मेरे पास एक नियंत्रण है जिसमें इसमें बाइट सरणी है।2 बाइट्स को

हर अब और फिर दो बाइट्स हैं जो मुझे सरणी में भविष्य की वस्तुओं की संख्या के बारे में कुछ जानकारी बताते हैं।

तो मैं हो सकता था एक उदाहरण के रूप:

 
... 
... 
Item [4] = 7 
Item [5] = 0 
... 
...

इस का मूल्य स्पष्ट रूप से 7.

इस बारे में है लेकिन क्या?

 
... 
... 
Item [4] = 0 
Item [5] = 7 
... 
...

किसी भी विचार के बारे में कोई विचार (सामान्य int के रूप में)?

मैं बाइनरी गया और सोचा कि यह 11100000000 हो सकता है जो 17 9 2 के बराबर है। लेकिन मुझे नहीं पता कि यह वास्तव में कैसे काम करता है (यानी यह बाइट के लिए पूरे 8 आइटम का उपयोग करता है)।

क्या आउट परीक्षण के साथ इसे जानने का कोई तरीका है?

नोट: मैं सी # 3.0 और दृश्य स्टूडियो का उपयोग कर रहा 2008

+4

ऐसा लगता है कि आप हमें कुछ धारावाहिक डेटा को रिवर्स-इंजीनियर करने के लिए कह रहे हैं। यह मुश्किल हो जा रहा है। आप कम से कम पूर्ण बाइट सरणी के कुछ उदाहरण पोस्ट कर सकते हैं और यह तीन या चार सरल उदाहरणों के अनुरूप है। लेकिन आप इसे वैसे भी क्यों जानना चाहते हैं? आप कौनसी समस्याएं हल करने की कोशिश कर रहे हैं? –

+0

मैं ओपनएनईटीसीएफ नियंत्रण में हस्ताक्षर नियंत्रण द्वारा लौटे बाइट सरणी को समझने की कोशिश कर रहा हूं ताकि मैं इसे 180 डिग्री घुमा सकूं। अधिक जानकारी के लिए यह प्रश्न http://stackoverflow.com/questions/2657388/opennetcf-ignature-control-question देखें। – Vaccano

उत्तर

19

BitConverter आसानी से एक दो-बाइट पूर्णांक मान में दो बाइट्स में बदल सकते हैं:

// assumes byte[] Item = someObject.GetBytes(): 
short num = BitConverter.ToInt16(Item, 4); // makes a short 
    // out of Item[4] and Item[5] 
+1

@ माचो मैट: यदि आप पहले से ही स्वीकृत उत्तर पर टिप्पणी करना चाहते हैं, तो संपादन से अधिक टिप्पणी छोड़ना बेहतर है प्रश्न स्वयं भी। इसके अलावा, आपका बिंदु सख्ती से सटीक नहीं था - इससे कोई फर्क नहीं पड़ता कि कंप्यूटर सिस्टम बड़ा-अंतराल या छोटा-अंत है, यह केवल तभी महत्वपूर्ण है जब मूल रूप से बाइट सरणी बनाने वाली प्रणाली प्रणाली की तुलना में एक अलग अंतराल है यहां .NET कोड चला रहा है। – MusiGenesis

+0

यह मानता है कि उन दो बाइट्स के द्विआधारी प्रतिनिधित्व का एमएसबी साइन बिट (1 = -ve, 0 = + ve) है। यदि ऐसा नहीं है, यानी यदि संख्या हस्ताक्षरित है , तो आपको इसका उपयोग करने की आवश्यकता है। ushort num = BitConverter.ToUInt16 (आइटम, 4)। यह भी ध्यान रखें कि अगर आपके आर्किटेक्चर थोड़ा एंडियन है तो उसे पहले बाइट (सबसे महत्वपूर्ण बाइट) के रूप में इंडेक्स 5 पर बाइट होगा। reinventingthewheel पढ़ें mo के लिए .azurewebsites.net/TwosComplementTut.aspx साइन बिट पर फिर से जानकारी। –

11

एक दो बाइट संख्या एक कम और एक उच्च बाइट है।

value = 256 * high + low; 

तो, उच्च = 0 और कम = 7 के लिए, मूल्य 7. है लेकिन उच्च = 7 और कम = 0 के लिए, मूल्य हो जाता है: उच्च बाइट कम बाइट के रूप में के रूप में ज्यादा 256 बार लायक है 17 9 2.

यह निश्चित रूप से मानता है कि संख्या एक साधारण 16-बिट पूर्णांक है। यदि यह कुछ प्रशंसक है, तो उपर्युक्त पर्याप्त नहीं होगा। फिर आपको इसे डीकोड करने के लिए, संख्या को एन्कोड किए जाने के बारे में अधिक जानकारी चाहिए।

ऑर्डर जिसमें उच्च और निम्न बाइट दिखाई देते हैं, बाइट स्ट्रीम के endianness द्वारा निर्धारित किया जाता है। बड़े-एंडियन में, आप कम (कम पते पर) से पहले उच्च देखेंगे, थोड़ा-अंत में यह चारों ओर एक और तरीका है।

+9

ध्यान देने योग्य भी: '(उच्च << 8) | कम – GeReV

0

यदि वे बाइट एक पूर्णांक के "भाग" हैं तो यह इस तरह काम करता है। लेकिन सावधान रहें, कि बाइट्स का क्रम प्लेटफार्म विशिष्ट है और यह भी पूर्णांक की लंबाई (16 बिट = 2 बाइट्स, 32 बिट = 4 बाइट्स, ...)

0

बिटकॉन्टर का उपयोग करें। TII3232 100% सुनिश्चित करें कि आपको सही परिणाम मिलेगा लेकिन आप

7

कह सकते हैं कि "यह मान स्पष्ट रूप से 7 है", लेकिन यह पूरी तरह से एन्कोडिंग पर निर्भर करता है। अगर हम पूर्ण चौड़ाई बाइट मानते हैं, तो थोड़ा-अंत में, हाँ; 7, 0 7 है। लेकिन बड़े एंडियन में यह नहीं है।

थोड़ा-endian के लिए, क्या आप चाहते

int i = byte[i] | (byte[i+1] << 8); 

और बड़े endian के लिए:

int i = (byte[i] << 8) | byte[i+1]; 

लेकिन अन्य एन्कोडिंग योजनाओं उपलब्ध हैं; उदाहरण के लिए, कुछ योजनाएं 7-बिट अंकगणित का उपयोग करती हैं, 8 वें बिट के साथ निरंतरता बिट के रूप में। कुछ योजनाएं (यूटीएफ -8) ने पहले बाइट में सभी निरंतर बिट्स लगाए हैं (इसलिए पहले डेटा बिट्स के लिए केवल सीमित कक्ष है), और अनुक्रम में बाकी के लिए 8 बिट्स हैं।

+0

अच्छा बिंदु। लेकिन उपयोग से मैं देख सकता हूं कि मान 7 है (सरणी में निर्देशांक के सात और अनुभाग हैं। – Vaccano

2

आप बस द्विपदीय प्रारूप में एक दूसरे के बगल उन दो बाइट्स डाल दिया, और देखो क्या है कि बड़ी संख्या है चाहते हैं दशमलव में है, तो आप इस कोड का उपयोग करने की जरूरत है: आप short num = BitConverter.ToInt16(Item, 4); का उपयोग करते हैं के रूप में स्वीकार जवाब में देखा

  if (BitConverter.IsLittleEndian) 
      { 
       byte[] tempByteArray = new byte[2] { Item[5], Item[4] }; 
       ushort num = BitConverter.ToUInt16(tempByteArray, 0); 
      } 
      else 
      { 
       ushort num = BitConverter.ToUInt16(Item, 4); 
      } 

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

0

मामले में है कि आइटम [5] है MSB

  1. ushort परिणाम = BitConverter.ToUInt16 (नई बाइट [2] {मद [5], मद [4]}, 0);

  2. int परिणाम = 256 * आइटम [5] + आइटम [4];

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