2011-01-22 21 views
21

मेरे पास byte[] है जो मैंने एक फ़ाइल से पढ़ा है, और मैं int इसमें दो बाइट्स प्राप्त करना चाहता हूं। यहाँ एक उदाहरण है:दो बाइट्स को पूर्णांक में पढ़ें?

byte[] bytes = new byte[] {(byte)0x00, (byte)0x2F, (byte)0x01, (byte)0x10, (byte)0x6F}; 
int value = bytes.getInt(2,4); //This method doesn't exist 

यह दशमलव में value बराबर 0x0110 के लिए, या 272 बनाना चाहिए। लेकिन जाहिर है, byte[].getInt() मौजूद नहीं है। मैं यह कार्य कैसे पूरा कर सकता हूं?

उपर्युक्त सरणी सिर्फ एक उदाहरण है। वास्तविक मूल्य मेरे लिए अज्ञात हैं।

+0

उत्तर का कारण यह है कि बाइट्स को पूर्णांक में पदोन्नत किया जाता है, जिससे आपको समझ में परेशानी होती है। "बाइट्स [2] * 256" बाइट में फिट नहीं है, लेकिन यह कोई मुद्दा नहीं है क्योंकि "256" एक पूर्णांक है, आदि – SyntaxT3rr0r

+1

संभावित डुप्लिकेट [4 बाइट्स को int में कनवर्ट करें] (http://stackoverflow.com/प्रश्न/2383265/कन्वर्ट -4-बाइट्स-टू-इंट) – finnw

उत्तर

36

तुम सिर्फ साधारण के लिए चुनते चाहिए:

int val = ((bytes[2] & 0xff) << 8) | (bytes[3] & 0xff); 

आप भले ही आप गणना अपने कोड peppering नहीं करना चाहता था आप कार्यक्षमता देने के लिए अपने स्वयं के सहायक समारोह getBytesAsWord (byte[] bytes, int start) लिख सकता है लेकिन मुझे लगता है कि शायद होगा अधिक हो जाना

+1

आदर्श रूप से यह होना चाहिए (बी 1 << 8) | (बी 2 और 0x00ff) यदि दूसरा बाइट मान 128 से अधिक है, तो उपरोक्त रूपांतरण गलत मान देता है, क्योंकि जावा बाइट को नकारात्मक int के रूप में मानता है। – Gopi

+0

'0xff' क्यों? दूसरे शब्दों में, 'बाइट्स [0] << 8 | में क्या अंतर है बाइट्स [1] '? – arve0

+1

@ arve0 देखें http://stackoverflow.com/a/11380077/1685098 –

1

वैकल्पिक रूप से, आप इस्तेमाल कर सकते हैं:

int val = (bytes[2] << 8) + bytes[3] 
+1

नहीं: बाइट्स [2] 0x7f से बड़ा होने पर यह नकारात्मक अंतर लौटाएगा। पक्सडीब्लो के उत्तर से "और 0xff" आवश्यक है। इस अच्छा स्पष्टीकरण के लिए – Francois

6

प्रयास करें:

public static int getInt(byte[] arr, int off) { 
    return arr[off]<<8 &0xFF00 | arr[off+1]&0xFF; 
} // end of getInt 

आपका प्रश्न नहीं दर्शाई गई दो आर्ग (2,4) क्या मतलब। 2 और 4 आपके उदाहरण में समझ में नहीं आते हैं क्योंकि सरणी में इंडेक्स ऑक्सी 01 और 0x10 खोजने के लिए, मैंने अनुमान लगाया है कि आप लगातार दो तत्व लेना चाहते हैं, एक आम बात है, इसलिए मैंने अपनी विधि में +1 बंद कर दिया।

आप जावा में बाइट [] वर्ग का विस्तार नहीं कर सकते हैं, इसलिए आपके पास बाइट्स.getInt कोई विधि नहीं हो सकती है, इसलिए मैंने बाइट [] को पहले तर्क के रूप में उपयोग करने वाली एक स्थिर विधि बनाई है।

विधि करने के लिए 'चाल' है कि आप बाइट्स 8 बिट पूर्णांकों और मूल्यों पर हस्ताक्षर किए 0x80 से अधिक कर रहे नकारात्मक हैं और बढ़ाया जाएगा चिह्न (यानी 0xFFFFFF80 जब एक पूर्णांक के रूप में प्रयोग किया जाता) है। यही कारण है कि '& 0xFF' मास्किंग की आवश्यकता है। '< < 8' अधिक महत्वपूर्ण बाइट 8 बिट्स को छोड़ देता है। '|' दो मानों को जोड़ती है - जैसे '+' होगी। ऑपरेटरों का क्रम महत्वपूर्ण है क्योंकि < < में उच्चतम प्राथमिकता है, इसके बाद & है। - इस प्रकार कोई कोष्ठक की आवश्यकता नहीं है।

+0

Thx। एक ही चीज़ के लिए लेकिन हस्ताक्षरित मूल्य के लिए, मैंने उपयोग किया: 'वापसी arr [off] << 8 | एआर [ऑफ + 1] &0xFF; ' –

0

आप बाइटबफर का उपयोग कर सकते हैं। इसमें GetInt विधि है जिसे आप खोज रहे हैं और कई अन्य उपयोगी विधियां

2

यहां एक अच्छा सरल विश्वसनीय तरीका है।

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4); 
    // by choosing big endian, high order bytes must be put 
    // to the buffer before low order bytes 
    byteBuffer.order(ByteOrder.BIG_ENDIAN); 
    // since ints are 4 bytes (32 bit), you need to put all 4, so put 0 
    // for the high order bytes 
    byteBuffer.put((byte)0x00); 
    byteBuffer.put((byte)0x00); 
    byteBuffer.put((byte)0x01); 
    byteBuffer.put((byte)0x10); 
    byteBuffer.flip(); 
    int result = byteBuffer.getInt(); 
0

Google Base16 क्लास गुवा -14.0.1 से है।

new BigInteger(com.google.common.io.BaseEncoding.base16().encode(bytesParam),16).longValue(); 
संबंधित मुद्दे