最近和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) }; } }
吐槽一下:網上找了半天博客,方法內容一大堆,楞是不知道到底咋用【大概我領悟力太差】。最後仍是本身弄出來了,特此記錄一下。