PacketFramingTools.java

package eu.javaexperience.binary;

public class PacketFramingTools
{
	public static byte[] optEscapeBytes(byte[] data, byte terminator, int extraEndPadding)
	{
		int w = 0;
		for(int i=0;i<data.length;++i)
		{
			if(data[i] == terminator)
			{
				++w;
			}
		}
		
		if(0 == w && 0 == extraEndPadding)
		{
			return data;
		}
		
		byte[] ret = new byte[data.length+w+extraEndPadding];
		
		w = 0;
		
		for(int i=0;i<data.length;++i)
		{
			ret[w++] = data[i];
			if(terminator == data[i])
			{
				ret[w++] = terminator;
			}
		}
		
		return ret;
	}
	
	public static byte[] frameBytes(byte[] data, byte terminator)
	{
		byte[] ret = optEscapeBytes(data, terminator, 2);
		ret[ret.length-2] = terminator;
		ret[ret.length-1] = (byte) ~terminator;
		return ret;
	}
}