2015-04-15 5 views
6

संरक्षण मैं जानता हूँ कि मैं इस तरह पूर्णांक से बाइट्स निकाल सकते हैं:पूर्णांक में श्रृंखलाबद्ध बाइट या कम संकेत

bytes[] IntToBytes(int i) 
{ 
    return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)}; 
} 

जो मैं बाद में एक सीरियल संचरण के हिस्से के रूप में भेजें। लेकिन क्या मैं बाइट्स के अनुक्रम प्राप्त करने के बाद, मूल डेटा का पुनर्निर्माण, संकेत को संरक्षित करने के बाद रिवर्स कर सकता हूं। वर्तमान में, मैं यह करता हूं, लेकिन यह शीर्ष पर थोड़ा सा लगता है:

int BytesToInt(byte hi, byte lo) 
{ 
    return ((hi << 24) | (lo << 16)) >> 16; 
} 

क्या कोई और तरीका या बेहतर तरीका है? अगर मुझे पता है कि मैं आखिरकार हस्ताक्षरित 16-बिट डेटा से निपट रहा हूं तो क्या इससे कोई फर्क पड़ता है?

+1

क्या यह आपके प्रश्न का उत्तर देता है? http://stackoverflow.com/questions/2538390/convert-16-bit-signed-int-to-2-bytes –

+0

@josh बिटकॉन्टर आदर्श दिखता है, एंडियन परीक्षण पास करने के अधीन। – Graham

+0

'(int) बिटकॉन्टर.ओआईएनटी 16 (नया [] {लो, हाय}, 0);' – Sinatr

उत्तर

2

आप केवल 16-बिट डेटा के साथ काम कर रहे हैं। तो आप int क्यों पास कर रहे हैं (और लौट रहे हैं) और short नहीं? आप साइन जानकारी को दूर फेंक रहे हैं, इसलिए यह वास्तव में नकारात्मक संख्याओं के लिए काम नहीं करेगा। इसके बजाय, short का उपयोग करें और आप ठीक होंगे - और अतिरिक्त प्रकार की जानकारी आपके कोड को सुरक्षित बनाएगी।

byte[] ShortToBytes(short i) 
{ 
    return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)}; 
} 

short BytesToShort(byte hi, byte lo) 
{ 
    return unchecked((short)((hi << 8) | lo)); 
} 

मुख्य लाभ (अलग साफ होने से और वास्तव में काम कर) है कि आप अब विधि के लिए एक अमान्य मान पारित कर सकते हैं है। यह हमेशा अच्छा है :)

ओह, और मैं इंटरफ़ेस सममित - BytesToShort को रखने की अनुशंसा करता हूं byte[] (या कुछ अन्य संरचना जिसमें दो बाइट्स भी हो) लेना चाहिए।

+0

यह नकारात्मक संख्याओं के साथ अतिप्रवाह का कारण बनता है – Graham

+0

नहीं, ऐसा नहीं है। मैंने इसे नकारात्मक संख्याओं के साथ-साथ संख्याओं के यादृच्छिक सेट के लिए भी परीक्षण किया। क्या आप शायद 'हाय' और 'लो' स्विच कर रहे हैं? 'शॉर्टटोबाइट्स 'और' बाइट्सओशॉर्ट' 'के वापसी मूल्य दोनों के लिए' बाइट [] 'का उपयोग करने का एक अन्य कारण :) – Luaan

+0

दिलचस्प। मुझे 'बाइट्सओशॉर्ट' पर किसी भी कॉल के साथ अतिप्रवाह मिलता है जहां 'hi> 127' का मान होता है। चेक किए गए/अनचेक सेटिंग – Graham

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