2011-05-06 12 views
5

मैं एक जावा क्लाइंट से डेटा को सी # सर्वर पर भेजने की कोशिश कर रहा हूं और int को बाइट सरणी में परिवर्तित करने में समस्या आ रही है।int से बाइट सरणी को परिवर्तित करते समय अलग-अलग परिणाम - .NET बनाम जावा

जब मैं इस कोड का उपयोग सी # के साथ नंबर 8342 परिवर्तित कर रहा हूँ:

BitConverter.GetBytes(8342) 

परिणाम है: एक्स [4] = {150, 32, 0, 0} जावा के साथ

मैं का उपयोग :

ByteBuffer bb = ByteBuffer.allocate(4); 
bb.putInt(8342); 
return bb.array(); 

और यहाँ परिणाम है: एक्स [4] = {0, 0, 32, -106}

कोई व्याख्या कर सकते हैं? मैं जावा के लिए नया हूं और यह पहली बार है जब मैं बाइट एरे में नकारात्मक संख्या देखता हूं।

bb.order(ByteOrder.LITTLE_ENDIAN) 

जावा भंडार बातें आंतरिक रूप से बिग एन्डियन के रूप में है, जबकि नेट डिफ़ॉल्ट रूप से लिटल एन्डियन है:

उत्तर

9

आप endianess बदलना होगा।

जावा और .NET के बीच हस्ताक्षरित और हस्ताक्षरित में भी अंतर है। जावा हस्ताक्षरित बाइट्स का उपयोग करता है, सी # हस्ताक्षरित का उपयोग करता है। आपको इसे भी बदलना होगा।

असल में, यही वजह है कि आप -106 (150 - 256) देख रहे हैं

आप नीचे दिए गए उपयोगिता विधि की तरह कुछ करना होगा:

public static void putUnsignedInt (ByteBuffer bb, long value) 
    { 
     bb.putInt ((int)(value & 0xffffffffL)); 
    } 

ध्यान दें कि मूल्य लंबा है।

+0

वैसे बाइटबफर को दस्तावेज किया गया है (इसलिए जेडोक पढ़ने में मदद मिलेगी) बिगएंडियन को डिफ़ॉल्ट रूप से उपयोग करने के लिए, लेकिन यह वास्तव में एक दिलचस्प सवाल है, क्या जावा इस्तेमाल किए गए बाइटऑर्डर को परिभाषित करता है? मुझे संदेह है - उच्च प्रदर्शन हिट के लिए बहुत कुछ होगा और ध्यान देने योग्य नहीं होगा (जब आउटपुट लिखते हैं और हम इसे दस्तावेज़ीकरण के अनुसार आसानी से परिवर्तित कर सकते हैं) – Voo

+0

मुझे लगता है कि आउटपुट अब -106, 32, 0, 0 –

+0

होगा @ बाला आर - हस्ताक्षरित और हस्ताक्षरित – manojlds

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