2015-07-13 17 views
15

में कनवर्ट करना मेरे पास कुछ बाइनरी ऑपरेशंस हैं जो मुझे उम्मीद नहीं कर रहे हैं। मेरे पास इन मानों वाले पहले 2 बाइट्स के साथ बाइट सरणी है: 0x5, और 0xE0। मैं उन्हें एक पूर्णांक मान में जोड़ना चाहता हूं जो 0x5E0 होना चाहिए। मैं कर की कोशिश की:बिट ऑपरेशंस एक पूर्णांक

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

लेकिन मूल्य 0xFFFFFFEE0 बाहर आ रहा है और पहली बाइट 0x5

खो रहा है मुझे लगा कि यह आसान हो सकता है? मैं क्या गलत कर रहा हूं?

+2

@RedRoboHood इस एक ही है, '' << एक उच्च प्राथमिकता है। – Maroun

+2

नियमित रूप से "गंभीर रूप से काम नहीं कर रहे" नियमित रूप से गंभीर जावा जावा बग की तरह "काम की तरह काम नहीं कर रहा" के लिए वोट दिया गया। – zubergu

उत्तर

13

कोशिश करें: int val = ((b[i] & 0xff) << 8) | (b[i + 1] & 0xff)। बाइट्स (दुर्भाग्यवश) जावा में हस्ताक्षरित हैं, इसलिए यदि उच्च बिट सेट किया गया है, तो यह एक पूर्णांक में परिवर्तित होने पर साइन-विस्तारित हो जाता है।

+1

यदि आप जावा 8 का उपयोग कर रहे हैं, तो 'Byte.toUnsignedInt' भी है। –

+1

मुझे यकीन नहीं है कि यह "दुर्भाग्य से" क्यों है;) – Maroun

+8

@MarounMaroun मुझे नहीं पता कि मैंने कभी उपयोगी होने के लिए बाइट हस्ताक्षर किए हैं, लेकिन मुझे पता है कि मैंने गलतियां की हैं क्योंकि वे हैं। मुझे लगता है कि मैं संपादकीयकरण छोड़ दिया होगा :-)। –

5

समस्या यह है कि byte डेटा प्रकार पर हस्ताक्षर किए गए हैं। इसलिए, b[i+1] ऑपरेशन करने से पहले साइन-विस्तारित हो जाता है, 0xFFFFFFE0 बन रहा है। जब से 0x0500 के साथ ओआर-एड प्राप्त होता है, तो 0x0500 गुम हो जाता है।

आप-और आईएनजी द्वारा इसे ठीक कर सकते आपरेशन प्रदर्शन से पहले 0xFF साथ:

public static int toInt16(byte high, byte low) { 
    int res = (high << 8); 
    res |= (low & 0xFF); 
    return res & 0xFFFF; 
} 

Demo.

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