Java輸出小端二進制文件

最近和C語言的系統有交互,須要給對方傳輸二進制文件,但C語言的文件默認是小端,而Java做爲網絡應用程序,默認是大端java

所以須要在寫入二進制文件的時候修改一下寫入字節的順序。數組

先看看普通寫入網絡

FileOutputStream fos = new FileOutputStream("D:/temp/test.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
DataOutputStream dos=new DataOutputStream(bos);

dos.writeShort(66);

dos.close();
bos.close();
fos.close();

用16進制編輯器打開文件能夠看到內容爲編輯器

00 42

然而C語言中的順序是小端先行,即code

42 00

查看DataOutputStream.writeShort源碼,其實它也是將數值分解成8位二進制(1byte)寫入源碼

public final void writeShort(int v) throws IOException {
    out.write((v >>> 8) & 0xFF);
    out.write((v >>> 0) & 0xFF);
    incCount(2);
}

故咱們能夠手動寫入byte數組,將目標數值手動轉化爲一個byte數組,因而咱們寫一個方法博客

// 小端輸出模式
public static byte[] short2Bytes(short a) {
    return new byte[] {
            (byte) (a & 0xFF),
            (byte) ((a >> 8) & 0xFF)
    };
}

修改調用,將最開始的it

dos.writeShort(66);

改成io

dos.write(short2Bytes((short)66));

輸出文件就是小端先行了。class

上面例子是寫入short。int也是同理,寫一個方法手動將int轉byte數組

// 小端輸出模式
public static byte[] int2Bytes(int a) {
    return new byte[] {
            (byte) (a & 0xFF),
            (byte) ((a >> 8) & 0xFF),
            (byte) ((a >> 16) & 0xFF),
            (byte) ((a >> 24) & 0xFF)
    };
}

調用的時候將

dos.writeInt(66);

改成

dos.write(int2Bytes(66));

至於long,按照規律,相信讀者本身能夠寫出來。

最後附上完整demo代碼

package smallend;

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;

public class SmallEndTest {

    public static void main(String[] args) throws Exception {
        FileOutputStream fos = new FileOutputStream("D:/temp/test.txt");
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        DataOutputStream dos=new DataOutputStream(bos);
        
        dos.writeShort(66); // 00 42
        dos.write(short2Bytes((short)66)); // 42 00
        
        dos.writeInt(66); // 00 00 00 42
        dos.write(int2Bytes(66)); // 42 00 00 00
        
        dos.close();
        bos.close();
        fos.close();

    }
    
    // 小端輸出模式
    public static byte[] short2Bytes(short a) {
        return new byte[] {
                (byte) (a & 0xFF),
                (byte) ((a >> 8) & 0xFF)
        };
    }
    
    // 小端輸出模式
    public static byte[] int2Bytes(int a) {
        return new byte[] {
                (byte) (a & 0xFF),
                (byte) ((a >> 8) & 0xFF),
                (byte) ((a >> 16) & 0xFF),
                (byte) ((a >> 24) & 0xFF)
        };
    }

}

吐槽一下:網上找了半天博客,方法內容一大堆,楞是不知道到底咋用【大概我領悟力太差】。最後仍是本身弄出來了,特此記錄一下。

相關文章
相關標籤/搜索