Skip to content
Snippets Groups Projects
ByteWriter.java 3.64 KiB
package io;

import java.io.IOException;
import java.io.OutputStream;

public class ByteWriter extends OutputStream {

	private OutputStream stream;
	private Endianness end = Endianness.LITTLE_ENDIAN;
	private int pos = 0;
	
	
	public ByteWriter(OutputStream out) {
		stream = out;
	}
	
	public ByteWriter setBigEndian() {
		end = Endianness.BIG_ENDIAN;
		return this;
	}
	
	public ByteWriter setLittleEndian() {
		end = Endianness.LITTLE_ENDIAN;
		return this;
	}
	
	public ByteWriter changeEndiannes() {
		if (isLitteEndian())
			setBigEndian();
		else 
			setLittleEndian();
		return this;
	}
	
	public boolean isBigEndian() {
		return end == Endianness.BIG_ENDIAN;
	}
	
	public boolean isLitteEndian() {
		return end == Endianness.LITTLE_ENDIAN;
	}
	
	public int getPosition() {
		return pos;
	}
	
	@Override
	public void write(int b) throws IOException {
		pos++;
		stream.write(b);
	}
	
	public void write(long b) throws IOException {
		write((int)b);
	}
	
	public void write2bytes(long n) throws IOException {
		long b0 = n & 0xff;
		long b1 = (n & 0xff00) >> 8;
		if (isLitteEndian()) {
			write(b0); write(b1);
		} else {
			write(b1); write(b0);
		}
	}
	
	public void write3bytes(long n) throws IOException {
		long b0 = n & 0xff;
		long b1 = (n & 0xff00) >> 8;
		long b2 = (n & 0xff0000) >> 16;
		if (isLitteEndian()) {
			write(b0); write(b1); write(b2);
		} else {
			write(b2); write(b1); write(b0);
		}
	}
	
	public void write4bytes(long n) throws IOException {
		long b0 = n & 0xff;
		long b1 = (n & 0xff00) >> 8;
		long b2 = (n & 0xff0000) >> 16;
		long b3 = (n & 0xff000000) >>> 24;
		if (isLitteEndian()) {
			write(b0); write(b1); write(b2); write(b3);
		} else {
			write(b3); write(b2); write(b1); write(b0);
		}
	}
	
	public void write5bytes(long n) throws IOException {
		long b0 = n & 0xff;
		long b1 = (n & 0xff00) >> 8;
		long b2 = (n & 0xff0000) >> 16;
		long b3 = (n & 0xff000000) >>> 24;
		long b4 = (n & 0xff00000000L) >> 32;
		if (isLitteEndian()) {
			write(b0); write(b1); write(b2); write(b3); write(b4);
		} else {
			write(b4); write(b3); write(b2); write(b1); write(b0);
		}
	}
	
	public void write6bytes(long n) throws IOException {
		long b0 = n & 0xff;
		long b1 = (n & 0xff00) >> 8;
		long b2 = (n & 0xff0000) >> 16;
		long b3 = (n & 0xff000000) >>> 24;
		long b4 = (n & 0xff00000000L) >> 32;
		long b5 = (n & 0xff0000000000L) >> 40;
		if (isLitteEndian()) {
			write(b0); write(b1); write(b2); write(b3); write(b4); write(b5);
		} else {
			write(b5); write(b4); write(b3); write(b2); write(b1); write(b0);
		}
	}
	
	public void write7bytes(long n) throws IOException {
		long b0 = n & 0xff;
		long b1 = (n & 0xff00) >> 8;
		long b2 = (n & 0xff0000) >> 16;
		long b3 = (n & 0xff000000) >>> 24;
		long b4 = (n & 0xff00000000L) >> 32;
		long b5 = (n & 0xff0000000000L) >> 40;
		long b6 = (n & 0xff000000000000L) >> 48;
		if (isLitteEndian()) {
			write(b0); write(b1); write(b2); write(b3); write(b4); write(b5); write(b6);
		} else {
			write(b6); write(b5); write(b4); write(b3); write(b2); write(b1); write(b0);
		}
	}
	
	public void write8bytes(long n) throws IOException {
		long b0 = n & 0xff;
		long b1 = (n & 0xff00) >> 8;
		long b2 = (n & 0xff0000) >> 16;
		long b3 = (n & 0xff000000) >>> 24;
		long b4 = (n & 0xff00000000L) >> 32;
		long b5 = (n & 0xff0000000000L) >> 40;
		long b6 = (n & 0xff000000000000L) >> 48;
		long b7 = (n & 0xff00000000000000L) >>> 56;
		if (isLitteEndian()) {
			write(b0); write(b1); write(b2); write(b3); write(b4); write(b5); write(b6); write(b7);
		} else {
			write(b7); write(b6); write(b5); write(b4); write(b3); write(b2); write(b1); write(b0);
		}
	}
	
	public void writeBytes(byte[] b) throws IOException {
		for (byte i : b) 
			write(i);
	}
}