/** * Puts a standard data type with the specified value, byte order and transformation. * * @param type The data type. * @param order The byte order. * @param transformation The transformation. * @param value The value. * @throws IllegalStateException if this reader is not in byte access mode. * @throws IllegalArgumentException if the combination is invalid. */ public void put(DataType type, DataOrder order, DataTransformation transformation, Number value) { checkByteAccess(); long longValue = value.longValue(); int length = type.getBytes(); if (order == DataOrder.BIG) { for (int i = length - 1; i >= 0; i--) { if (i == 0 && transformation != DataTransformation.NONE) { if (transformation == DataTransformation.ADD) { buffer.writeByte((byte) (longValue + 128)); } else if (transformation == DataTransformation.NEGATE) { buffer.writeByte((byte) (-longValue)); } else if (transformation == DataTransformation.SUBTRACT) { buffer.writeByte((byte) (128 - longValue)); } else { throw new IllegalArgumentException("unknown transformation"); } } else { buffer.writeByte((byte) (longValue >> (i * 8))); } } } else if (order == DataOrder.LITTLE) { for (int i = 0; i < length; i++) { if (i == 0 && transformation != DataTransformation.NONE) { if (transformation == DataTransformation.ADD) { buffer.writeByte((byte) (longValue + 128)); } else if (transformation == DataTransformation.NEGATE) { buffer.writeByte((byte) (-longValue)); } else if (transformation == DataTransformation.SUBTRACT) { buffer.writeByte((byte) (128 - longValue)); } else { throw new IllegalArgumentException("unknown transformation"); } } else { buffer.writeByte((byte) (longValue >> (i * 8))); } } } else if (order == DataOrder.MIDDLE) { if (transformation != DataTransformation.NONE) { throw new IllegalArgumentException("middle endian cannot be transformed"); } if (type != DataType.INT) { throw new IllegalArgumentException("middle endian can only be used with an integer"); } buffer.writeByte((byte) (longValue >> 8)); buffer.writeByte((byte) longValue); buffer.writeByte((byte) (longValue >> 24)); buffer.writeByte((byte) (longValue >> 16)); } else if (order == DataOrder.INVERSED_MIDDLE) { if (transformation != DataTransformation.NONE) { throw new IllegalArgumentException("inversed middle endian cannot be transformed"); } if (type != DataType.INT) { throw new IllegalArgumentException( "inversed middle endian can only be used with an integer"); } buffer.writeByte((byte) (longValue >> 16)); buffer.writeByte((byte) (longValue >> 24)); buffer.writeByte((byte) longValue); buffer.writeByte((byte) (longValue >> 8)); } else { throw new IllegalArgumentException("unknown order"); } }