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