2012-11-15 18 views
20

मैं, क्यों पता करने के लिए जब मैं एक मूल्य के साथ एक byte सरणी तुलना उत्सुक हूँ ...बाइट मूल्यों की तुलना करें?

boolean match = ((data[0] & 0xFF) == 0xFE); 

... रिटर्न true, जबकि ...

boolean match = (data[0] == 0xFE); 

... करता है नहीं? data

data[0] = (byte) 0xFE; 
+0

आप किसी भी संकलक चेतावनी हो रही है? मुझे लगता है कि वे पूर्णांक अक्षर हो सकते हैं (और फिर तुलना int के रूप में की जा सकती है, सरणी में आपके नकारात्मक संख्या और सकारात्मक पूर्णांक अक्षर के साथ)। – Thilo

उत्तर

22
boolean match = ((data[0] & 0xFF) == 0xFE); 

पूर्णांकों तुलना के रूप में 0xFF एक पूर्णांक है, इस अभिव्यक्ति किसी पूर्णांक पर अपने बाइटdata[0] पैमाने और क्या एक दूसरे पूर्णांक 0xFE(254) करने के लिए कोष्ठक के अंदर की तुलना करेंगे। जैसा कि आप कहते हैं data[0](byte)0xFE है, इसे पहले पूर्णांक 0xFE पर और 0xFE पूर्णांक की तुलना में स्केल किया जाएगा, इसलिए यह काम करता है।

boolean match = (data[0] == 0xFE); 

पूर्णांक 0xFE करने के लिए एक बाइट तुलना: 254

data[0] = (byte) 0xFE; 

एक बाइट है (इसलिए यह signed है) और इसके मूल्य -2 है।

-2254 के बराबर नहीं है, तो यह है कि तुम क्यों एक बाइट के रूप में [0] डेटा की तुलना करना चाहिए है या पैमाने के रूप में यह यह पूर्णांक 0xFE की तुलना से पहले एक पूर्णांक तक।

एक सरल तुलना हो सकता है

boolean match = (data[0] == (byte)0xFE); 
+0

बहुत बहुत धन्यवाद! –

3

के साथ एक byte सरणी मेरा मानना ​​है कि यह संकेत विस्तार के साथ किसी पूर्णांक पर 0xFF को बढ़ावा देने के साथ क्या करना पड़ता है। पहली अभिव्यक्ति में, 0xFE को भी int में प्रचारित किया जाता है और इसलिए data[0] & 0xFF का परिणाम भी एक int है और एक int तुलना की जाती है।

लेकिन दूसरे कोड नमूने में, कोई ऑपरेशन नहीं किया जा रहा है और इसलिए int को कोई प्रचार नहीं है। यही कहना है कि डेटा [0] int में पदोन्नत नहीं होता है लेकिन 0xFE एक int है।

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