2010-02-06 11 views
16

मैं जावा पर एक प्रक्रिया पोर्ट कर रहा हूँ। सी # और सी ++ में पहले से ही काम कर रहे संस्करण हैं।जावा में लंबे [64] से बाइट [512] कनवर्ट करना?

मेरे पास सी # में एक अनुभाग है जो मैं 64 उलंगों को 512 बाइट्स में परिवर्तित करने के लिए मार्शल.कॉपी (...) करता हूं और सी ++ में वह पंक्ति मैं उसी चीज़ को करने के लिए memmove (...) का उपयोग करता हूं। एक ही परिणाम प्राप्त करने के लिए जावा में क्या उपलब्ध है? मुझे उसी क्रम में एक ही द्विआधारी जानकारी की आवश्यकता है जैसे कि लंबे समय के बजाय बाइट्स।

संपादित करें:

कारण मैं जावा के लिए पोर्टिंग रहा हूँ पोर्टेबिलिटी स्वाभाविक रूप से है कि जावा का लाभ लेने के लिए है। मैं देशी कोड का उपयोग नहीं करना चाहूंगा।

एक और बात। चूंकि जावा में हस्ताक्षरित मान नहीं हैं, इसलिए मुझे केवल कुछ ही करने का अनुरोध करने की आवश्यकता है। मैं 64 लम्बाई (सी # और सी ++ में उल्लिखित) से 8 हस्ताक्षरित बाइट मान प्राप्त करना चाहता हूं ताकि मैं उन मानों को बाद में सरणी में इंडेक्स पर उपयोग कर सकूं। यह हजारों बार होने की जरूरत है ताकि सबसे तेज़ तरीका सबसे अच्छा तरीका होगा।

उत्तर

20

ByteBuffer इस के लिए अच्छी तरह से काम करता है: सिर्फ 64 long मूल्यों में डाल दिया और एक byte[]array() पद्धति का उपयोग करके बाहर निकलना। ByteOrder वर्ग एंडियन मुद्दों को प्रभावी ढंग से संभाल सकता है। उदाहरण के लिए, दृष्टिकोण को शामिल एक टिप्पणी में सुझाव दिया wierob द्वारा:

private static byte[] xform(long[] la, ByteOrder order) { 
    ByteBuffer bb = ByteBuffer.allocate(la.length * 8); 
    bb.order(order); 
    bb.asLongBuffer().put(la); 
    return bb.array(); 
} 

परिशिष्ट: जिसके परिणामस्वरूप byte[] घटकों प्रवेश किया हुआ है, 8-बिट मूल्यों, लेकिन जावा सरणियों nonnegative integer index values आवश्यकता होती है।

int i = (int) b & 0xFF; 

यह answer लागू ऑपरेटर पूर्वता नियमों पर बताते हैं: एक int करने के लिए एक byte कास्टिंग संकेत विस्तार में परिणाम होगा, लेकिन उच्च आदेश बिट मास्किंग byte b की अहस्ताक्षरित मूल्य दे देंगे। यह संबंधित answerdouble मानों के लिए एक समान दृष्टिकोण प्रदर्शित करता है।

+1

+1 आपको लूप की भी आवश्यकता नहीं है: bb.asLongBuffer()। Put (la); – wierob

+1

धन्यवाद! आपका सुझाव पढ़ने और संभावित रूप से अधिक कुशल पढ़ने के लिए आसान है। http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views – trashgod

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