Javaのリトルエンディアンバイナリ出力

最近およびC言語の対話型システムは、あなたがお互いにバイナリファイルを転送する必要がありますが、デフォルトではC言語ファイルには、小端部にあるが、Java Webアプリケーションとして、デフォルトでは大きな終わりです

そこで我々は、バイナリファイルの書き込み時に書き込まれたバイトの順序を変更する必要があります。

通常の書き込みを見てみましょう

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

ファイルの内容を開くには進エディタは、と見ることができます

00 42

しかし、順序、すなわち、最初のC言語の小端部であり、

42 00

ビューDataOutputStream.writeShort源は、実際に、それはまた、8ビットのバイナリ値(1バイト)は、書き込みに分解されます

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

我々はこの方法を書くので、私たちは、バイト配列に、手動で手動の目標値をバイト配列を書き込むことができますので、

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

変更コールの始まり

dos.writeShort(66);

変更

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

出力ファイルは、最初の小端部です。

上記の例では、書き込み短いです。int型はint配列、バイト転送に手動メソッドを記述するために、同じ理由であります

// 小端输出模式
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));

限り、法律に従って、私は読者が自分自身を書くことができると信じています。

最後に、完全なデモコードを添付

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

}

Tucaoについて:長いブログを探して、インターネット、コンテンツ方法多く、最終的にはわかりませんがどのように悪い[について]私の理解にショックを受けています。最後に自分で出て、ここにそれを記録。

おすすめ

転載: www.cnblogs.com/tenny-peng/p/11847364.html