2013-01-24 11 views
5

मेरे पास वर्तमान में जावा बाइटबफर है जिसमें पहले से ही बिग एंडियन प्रारूप में डेटा है। मैं फिर एक बाइनरी फ़ाइल को लिटिल एंडियन के रूप में लिखना चाहता हूं।जावा में छोटे एंडियन बाइटबफर को छोटे एंडियन के लिए कैसे लिखें

public void writeBinFile(String fileName, boolean append) throws FileNotFoundException, IOException 
{ 
    FileOutputStream outStream = null; 
    try 
    { 
     outStream = new FileOutputStream(fileName, append); 
     FileChannel out = outStream.getChannel(); 
     byteBuff.position(byteBuff.capacity()); 
     byteBuff.flip(); 
     byteBuff.order(ByteOrder.LITTLE_ENDIAN); 
     out.write(byteBuff); 
    } 
    finally 
    { 
     if (outStream != null) 
     { 
      outStream.close(); 
     } 
    } 

} 

ध्यान दें कि byteBuff एक ByteBuffer बिग एन्डियन प्रारूप में भर गया है कि है:

यहाँ कोड है जो सिर्फ बड़ी एन्डियन में अभी भी फ़ाइल लिखते है।

मेरे अंतिम उपाय एक और बफर बनाने और स्थापित करने कि ByteBuffer थोड़ा endian के लिए और फिर मूल (बड़ा endian) बफर से "getInt" मूल्यों को पढ़ने का एक जानवर बल विधि, और "setInt" छोटे endian करने के लिए मूल्य है बफर। मुझे लगता है कि एक बेहतर तरीका है ...

+1

क्या आपने अपाचे कॉमन्स (http://commons.apache.org/io/api-release/org/apache/commons/io/EndianUtils.html) की कोशिश की है? अपाचे कॉमन्स के लिए –

+0

+1: पहिया को पुनर्निर्मित नहीं करना :) – BachT

उत्तर

4

एंडियन का कोई बाइट [] के लिए कोई अर्थ नहीं है। अंतहीनता केवल मल्टी-बाइट डेटा प्रकारों जैसे शॉर्ट, इंट, लांग, फ्लोट या डबल के लिए मायने रखती है। अंतहीन अधिकार प्राप्त करने का सही समय तब होता है जब आप बाइट्स को कच्चे डेटा लिख ​​रहे हैं और वास्तविक प्रारूप पढ़ रहे हैं।

यदि आपके पास बाइट [] दिया गया है, तो आपको मूल डेटा प्रकारों को डीकोड करना होगा और उन्हें विभिन्न अंतहीनता के साथ फिर से एन्कोड करना होगा। मुझे यकीन है कि आप सहमत होंगे कि यह एक है) करना आसान नहीं है या आदर्श बी) स्वचालित रूप से नहीं किया जा सकता है।

3

यहाँ कैसे मैं एक ऐसी ही समस्या हल, "endianness" पूर्णांकों की मैं कोई आउटपुट फ़ाइल सही करने के लिए लिख रहा हूँ प्राप्त करने के लिए इच्छुक है:

byte[] theBytes = /* obtain a byte array that is the input */ 
ByteBuffer byteBuffer = ByteBuffer.wrap(theBytes); 

ByteBuffer destByteBuffer = ByteBuffer.allocate(theBytes.length); 
destByteBuffer.order(ByteOrder.LITTLE_ENDIAN); 
IntBuffer destBuffer = destByteBuffer.asIntBuffer(); 

while (byteBuffer.hasRemaining()) 
{ 
    int element = byteBuffer.getInt(); 

    destBuffer.put(element); 

    /* Could write destBuffer int-by-int here, or outside this loop */ 
} 

वहाँ और अधिक कुशल तरीके यह करने के लिए हो सकता है, लेकिन मेरी विशेष समस्या के लिए, मुझे तत्वों के लिए गणितीय परिवर्तन लागू करना पड़ा क्योंकि मैंने उन्हें नए बफर में कॉपी किया था। लेकिन यह अभी भी आपकी विशेष समस्या के लिए काम करना चाहिए।

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