2012-05-29 14 views
7

पर 2 या 4 बाइट्स से कनवर्ट करें मुझे बाइट्स को हस्ताक्षरित/हस्ताक्षरित int या छोटा में कनवर्ट करना होगा।हस्ताक्षर/हस्ताक्षरित शॉर्ट/int

नीचे दिए गए तरीके सही हैं? किस पर हस्ताक्षर किए गए हैं और किसने हस्ताक्षर किए हैं?

बाइट आदेश: LITTLE_ENDIAN

public static int convertTwoBytesToInt1(byte b1, byte b2) { 
    return (int) ((b2 << 8) | (b1 & 0xFF)); 
} 

बनाम

public static int convertTwoBytesToInt2(byte b1, byte b2) { 
    return (int) (((b2 & 0xFF) << 8) | (b1 & 0xFF)); 
} 

और

public static int convertFourBytesToInt1(byte b1, byte b2, byte b3, byte b4){ 
    return (int) ((b4<<24)+(b3<<16)+(b2<<8)+b1); 
} 

बनाम

public static int convertFourBytesToInt2(byte b1, byte b2, byte b3, byte b4){ 
    return (int) (((b4 & 0xFF) << 24) | ((b3 & 0xFF) << 16) | ((b2 & 0xFF) << 8) | (b1 & 0xFF)); 
} 

मुझे कोई दिलचस्पी केवल इस रूपांतरण रूपों में कर रहा हूँ। धन्यवाद!

+1

मैं इस रूप में ByteBuffer का उपयोग बहुत अधिक कुशल हो सकता हैं और तुम सिर्फ सेट कर सकते हैं '.order (ByteOrder.LITTLE_ENDIAN)' –

उत्तर

6

प्रत्येक जोड़ी की पहली विधि (convertXXXToInt1()) हस्ताक्षरित है, दूसरा (convertXXXToInt2()) हस्ताक्षरित है।

हालांकि, जावा int हमेशा की तरह, पर हस्ताक्षर किए, इसलिए यदि b4 के उच्चतम बिट सेट किया गया है, convertFourBytesToInt2() का परिणाम नकारात्मक हो जाएगा, भले ही यह "अहस्ताक्षरित" संस्करण माना जाता है है।

मान लीजिए byte मान, b2 हेक्साडेसिमल में -1, या 0xFF है। << ऑपरेटर इसे int प्रकार के -1, या 0xFFFFFFFF के मान के साथ "प्रचारित" करने का कारण बनता है। 8 बिट्स की शिफ्ट के बाद, यह 0xFFFFFF00 होगा, और 24 बाइट्स की शिफ्ट के बाद, यह 0xFF000000 होगा।

हालांकि, यदि आप bitwise & ऑपरेटर को लागू करते हैं, तो उच्च-आदेश बिट्स शून्य पर सेट हो जाएंगे। यह संकेत जानकारी को त्याग देता है। यहां दो मामलों के पहले चरण दिए गए हैं, जो अधिक विस्तार से काम करते हैं।

प्रवेश किया गया:

byte b2 = -1; // 0xFF 
int i2 = b2; // 0xFFFFFFFF 
int n = i2 << 8; // 0x0xFFFFFF00 

अहस्ताक्षरित:

byte b2 = -1; // 0xFF 
int i2 = b2 & 0xFF; // 0x000000FF 
int n = i2 << 8; // 0x0000FF00 
+0

convertFourBytesToInt1 बी 1 पर और 0xff नहीं है ... तो अगर मैं डाल नहीं इससे कोई फ़र्क नहीं पड़ता? अभी भी int हस्ताक्षर किया है? – blackwolf

+0

@ ब्लैकवॉल्फ असल में, इससे कोई फर्क पड़ता है, क्योंकि आप '+' ऑपरेटर के साथ बाइट्स को जोड़ रहे हैं। मैंने पहले यह नहीं देखा था, क्योंकि अन्य '|' ऑपरेटर का उपयोग करते हैं, जिसे बिट मैनिपुलेशन के लिए प्राथमिकता दी जाती है। अभिव्यक्ति '(int) ((बी 4 << 24) | ((बी 3 और 0xFF) << 16) | ((बी 2 और 0xFF) << 8) | (बी 1 और 0xFF))' – erickson

1

, 4 बाइट अहस्ताक्षरित रूपांतरण के साथ कोई समस्या है, क्योंकि यह किसी पूर्णांक में फिट नहीं करता है। नीचे दिशानिर्देश सही ढंग से काम करते हैं।

public class IntegerConversion 
{ 
    public static int convertTwoBytesToInt1 (byte b1, byte b2)  // signed 
    { 
    return (b2 << 8) | (b1 & 0xFF); 
    } 

    public static int convertFourBytesToInt1 (byte b1, byte b2, byte b3, byte b4) 
    { 
    return (b4 << 24) | (b3 & 0xFF) << 16 | (b2 & 0xFF) << 8 | (b1 & 0xFF); 
    } 

    public static int convertTwoBytesToInt2 (byte b1, byte b2)  // unsigned 
    { 
    return (b2 & 0xFF) << 8 | (b1 & 0xFF); 
    } 

    public static long convertFourBytesToInt2 (byte b1, byte b2, byte b3, byte b4) 
    { 
    return (long) (b4 & 0xFF) << 24 | (b3 & 0xFF) << 16 | (b2 & 0xFF) << 8 | (b1 & 0xFF); 
    } 

    public static void main (String[] args) 
    { 
    byte b1 = (byte) 0xFF; 
    byte b2 = (byte) 0xFF; 
    byte b3 = (byte) 0xFF; 
    byte b4 = (byte) 0xFF; 

    System.out.printf ("%,14d%n", convertTwoBytesToInt1 (b1, b2)); 
    System.out.printf ("%,14d%n", convertTwoBytesToInt2 (b1, b2)); 

    System.out.printf ("%,14d%n", convertFourBytesToInt1 (b1, b2, b3, b4)); 
    System.out.printf ("%,14d%n", convertFourBytesToInt2 (b1, b2, b3, b4)); 
    } 
} 
+0

बी 1 क्या है और 0xFF के लिए? नकारात्मक मूल्यों को रोकने के लिए – ScottF

+0

@ScottF -। – dmolony