2013-01-24 34 views
5

Tôi hiện đang có một ByteBuffer Java đã có dữ liệu ở định dạng Big Endian. Sau đó tôi muốn viết vào một tập tin nhị phân như Little Endian.Làm thế nào để viết ByteBuffer cuối cùng lớn đến ít endian trong Java

Dưới đây là đoạn code mà chỉ viết các tập tin vẫn còn trong Big Endian:

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(); 
     } 
    } 

} 

Lưu ý rằng byteBuff là một ByteBuffer đã được lấp đầy ở định dạng Big Endian. Khu nghỉ mát cuối cùng của tôi là phương pháp bạo lực tạo ra một bộ đệm khác và thiết lập ByteBuffer thành ít endian và sau đó đọc các giá trị "getInt" từ bộ đệm gốc (lớn cuối) và "setInt" giá trị cho endian nhỏ đệm. Tôi tưởng tượng có một cách tốt hơn ...

+1

Bạn đã thử Apache commons (http://commons.apache.org/io/api-release/org/apache/commons/io/EndianUtils.html) chưa? –

+0

+1 cho Apache Commons: không phát minh lại bánh xe :) – BachT

Trả lời

4

Endianess không có ý nghĩa đối với một byte []. Endianess chỉ quan trọng đối với các kiểu dữ liệu nhiều byte như ngắn, int, long, float hoặc double. Đúng thời điểm để có được quyền cuối cùng là khi bạn đang viết dữ liệu thô vào các byte và đọc định dạng thực tế.

Nếu bạn có một byte [] cho bạn, bạn phải giải mã các kiểu dữ liệu gốc và mã hóa lại chúng với độ dài khác nhau. Tôi chắc chắn bạn sẽ đồng ý đây là một) không dễ dàng để làm hoặc lý tưởng b) không thể được thực hiện automagically.

3

Dưới đây là cách tôi giải quyết một vấn đề tương tự, muốn để có được những "endianness" của Integers Tôi đang viết một tập tin đầu ra chính xác:

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 */ 
} 

Có thể có những cách hiệu quả hơn để làm điều này, nhưng đối với vấn đề cụ thể của tôi, tôi đã phải áp dụng một phép chuyển đổi toán học cho các phần tử khi tôi sao chép chúng vào bộ đệm mới. Nhưng điều này vẫn sẽ làm việc cho vấn đề cụ thể của bạn.