2012-03-24 14 views
8

में कनवर्ट करना मेरे पास एक बाइट [4] है जिसमें 32-बिट हस्ताक्षरित पूर्णांक (बड़े एंडियन ऑर्डर में) शामिल है और मुझे इसे लंबे समय तक परिवर्तित करने की आवश्यकता है (int int एक हस्ताक्षरित संख्या नहीं है)।32-बिट हस्ताक्षरित पूर्णांक (बड़े एंडियन) को लंबे और पीछे

इसके अलावा, मैं इसे इसके विपरीत कैसे कर सकता हूं (यानी लंबे समय से जिसमें 32-बिट हस्ताक्षरित पूर्णांक बाइट [4] है)?

+0

बाइट सरणी कहां से आती है? – Raffaele

+0

@Raffaele फ़ाइल से – Aviram

उत्तर

12

ByteBuffer के लिए एक काम की तरह लगता है।

कुछ हद तक की तरह

public static void main(String[] args) { 
    byte[] payload = toArray(-1991249); 
    int number = fromArray(payload); 
    System.out.println(number); 
} 

public static int fromArray(byte[] payload){ 
    ByteBuffer buffer = ByteBuffer.wrap(payload); 
    buffer.order(ByteOrder.BIG_ENDIAN); 
    return buffer.getInt(); 
} 

public static byte[] toArray(int value){ 
    ByteBuffer buffer = ByteBuffer.allocate(4); 
    buffer.order(ByteOrder.BIG_ENDIAN); 
    buffer.putInt(value); 
    buffer.flip(); 
    return buffer.array(); 
} 
+0

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन यदि मैं 'int value = buffer.getInt(); 'तो हो सकता है, तो हो सकता है कि int पूरे नंबर को शामिल न करने में सक्षम न हो (यदि यह हस्ताक्षरित है और हस्ताक्षरित नहीं है) । – Aviram

+0

@Aviram जावा में एक पूर्णांक 32-बिट्स (4 बाइट्स) है, जब तक कि आपका बाइटबफर 4 बाइट लंबा हो, मुझे नहीं लगता कि समस्या क्यों होनी चाहिए। मैंने अपना जवाब सुधार लिया है और मैंने इसे सकारात्मक और नकारात्मक के साथ परीक्षण किया है और यह अभी तक ठीक काम करता है। क्या मुझे कुछ याद आ रहा है? यदि आप बिना हस्ताक्षर किए गए पूर्णांक का उपयोग करना चाहते हैं तो लंबे समय तक और पूर्णांक का उपयोग न करें, क्योंकि जावा में पूर्णांक हस्ताक्षरित हैं। –

+3

आप 'वापसी buffer.getInt() और 0xFFFFFFFFL का उपयोग कर सकते हैं;' क्योंकि आपको हमेशा हस्ताक्षरित मान प्राप्त होगा। बाइटबफर डिफ़ॉल्ट रूप से BIG_ENDIAN हैं। आपको 'array()' –

8

आप ByteBuffer उपयोग कर सकते हैं, या आप इसे पुराने तरीके से कर सकते हैं:

long result = 0x00FF & byteData[0]; 
result <<= 8; 
result += 0x00FF & byteData[1]; 
result <<= 8; 
result += 0x00FF & byteData[2]; 
result <<= 8; 
result += 0x00FF & byteData[3]; 
1

अमरूद अहस्ताक्षरित संख्यात्मक मान के साथ काम करने के लिए उपयोगी वर्गों है।

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/primitives/UnsignedInts.html#toLong(int)

+0

अच्छा बिंदु, जो इस सवाल की एक टिप्पणी में पीटर लॉरी द्वारा वर्णित 0xFFFFFFFFL विधि का अत्यधिक उपयोग कर रहा है। –

+0

क्यों लंदन (Integer.MIN_VALUE) काम नहीं करता है? और ऋणात्मक लंबे http://ideone.com/cERLo1 लौटें – gavioto

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