| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.commons.imaging.common; |
| |
| public class BinaryConversions implements BinaryConstants { |
| public static byte[] convertToByteArray(short[] values, int byteOrder) { |
| return convertToByteArray(values, 0, values.length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(short[] values, int length, int byteOrder) { |
| return convertToByteArray(values, 0, length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(short[] values, int offset, int length, int byteOrder) { |
| byte[] result = new byte[length * 2]; |
| for (int i = 0; i < length; i++) { |
| short value = values[offset + i]; |
| int start = i * 2; |
| if (byteOrder == BYTE_ORDER_MOTOROLA) { |
| result[start + 0] = (byte) (value >> 8); |
| result[start + 1] = (byte) (value >> 0); |
| } else { |
| result[start + 1] = (byte) (value >> 8); |
| result[start + 0] = (byte) (value >> 0); |
| } |
| } |
| return result; |
| } |
| |
| public static byte[] convertToByteArray(int[] values, int byteOrder) { |
| return convertToByteArray(values, 0, values.length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(int[] values, int length, int byteOrder) { |
| return convertToByteArray(values, 0, length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(int[] values, int offset, int length, int byteOrder) { |
| byte[] result = new byte[length * 4]; |
| for (int i = 0; i < length; i++) { |
| int value = values[offset + i]; |
| int start = i * 4; |
| if (byteOrder == BYTE_ORDER_MOTOROLA) { |
| result[start + 0] = (byte) (value >> 24); |
| result[start + 1] = (byte) (value >> 16); |
| result[start + 2] = (byte) (value >> 8); |
| result[start + 3] = (byte) (value >> 0); |
| } else { |
| result[start + 3] = (byte) (value >> 24); |
| result[start + 2] = (byte) (value >> 16); |
| result[start + 1] = (byte) (value >> 8); |
| result[start + 0] = (byte) (value >> 0); |
| } |
| } |
| return result; |
| } |
| |
| public static byte[] convertToByteArray(float[] values, int byteOrder) { |
| return convertToByteArray(values, 0, values.length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(float[] values, int length, int byteOrder) { |
| return convertToByteArray(values, 0, length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(float[] values, int offset, int length, int byteOrder) { |
| byte[] result = new byte[values.length * 4]; |
| for (int i = 0; i < values.length; i++) { |
| float value = values[i]; |
| int bits = Float.floatToRawIntBits(value); |
| int start = i * 4; |
| if (byteOrder == BYTE_ORDER_INTEL) { |
| result[start + 0] = (byte) (0xff & (bits >> 0)); |
| result[start + 1] = (byte) (0xff & (bits >> 8)); |
| result[start + 2] = (byte) (0xff & (bits >> 16)); |
| result[start + 3] = (byte) (0xff & (bits >> 24)); |
| } else { |
| result[start + 3] = (byte) (0xff & (bits >> 0)); |
| result[start + 2] = (byte) (0xff & (bits >> 8)); |
| result[start + 1] = (byte) (0xff & (bits >> 16)); |
| result[start + 0] = (byte) (0xff & (bits >> 24)); |
| } |
| } |
| return result; |
| } |
| |
| public static byte[] convertToByteArray(double[] values, int byteOrder) { |
| return convertToByteArray(values, 0, values.length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(double[] values, int length, int byteOrder) { |
| return convertToByteArray(values, 0, length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(double[] values, int offset, int length, int byteOrder) { |
| byte[] result = new byte[length * 8]; |
| for (int i = 0; i < length; i++) { |
| double value = values[offset + i]; |
| long bits = Double.doubleToRawLongBits(value); |
| int start = i * 8; |
| if (byteOrder == BYTE_ORDER_INTEL) { |
| result[start + 0] = (byte) (0xff & (bits >> 0)); |
| result[start + 1] = (byte) (0xff & (bits >> 8)); |
| result[start + 2] = (byte) (0xff & (bits >> 16)); |
| result[start + 3] = (byte) (0xff & (bits >> 24)); |
| result[start + 4] = (byte) (0xff & (bits >> 32)); |
| result[start + 5] = (byte) (0xff & (bits >> 40)); |
| result[start + 6] = (byte) (0xff & (bits >> 48)); |
| result[start + 7] = (byte) (0xff & (bits >> 56)); |
| } else { |
| result[start + 7] = (byte) (0xff & (bits >> 0)); |
| result[start + 6] = (byte) (0xff & (bits >> 8)); |
| result[start + 5] = (byte) (0xff & (bits >> 16)); |
| result[start + 4] = (byte) (0xff & (bits >> 24)); |
| result[start + 3] = (byte) (0xff & (bits >> 32)); |
| result[start + 2] = (byte) (0xff & (bits >> 40)); |
| result[start + 1] = (byte) (0xff & (bits >> 48)); |
| result[start + 0] = (byte) (0xff & (bits >> 56)); |
| } |
| } |
| return result; |
| } |
| |
| public static byte[] convertToByteArray(RationalNumber[] values, int byteOrder) { |
| return convertToByteArray(values, 0, values.length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(RationalNumber[] values, int length, int byteOrder) { |
| return convertToByteArray(values, 0, length, byteOrder); |
| } |
| |
| public static byte[] convertToByteArray(RationalNumber[] values, int offset, int length, int byteOrder) { |
| byte[] result = new byte[length * 8]; |
| for (int i = 0; i < length; i++) { |
| RationalNumber value = values[offset + i]; |
| int start = i * 8; |
| if (byteOrder == BYTE_ORDER_MOTOROLA) { |
| result[start + 0] = (byte) (value.numerator >> 24); |
| result[start + 1] = (byte) (value.numerator >> 16); |
| result[start + 2] = (byte) (value.numerator >> 8); |
| result[start + 3] = (byte) (value.numerator >> 0); |
| result[start + 4] = (byte) (value.divisor >> 24); |
| result[start + 5] = (byte) (value.divisor >> 16); |
| result[start + 6] = (byte) (value.divisor >> 8); |
| result[start + 7] = (byte) (value.divisor >> 0); |
| } else { |
| result[start + 3] = (byte) (value.numerator >> 24); |
| result[start + 2] = (byte) (value.numerator >> 16); |
| result[start + 1] = (byte) (value.numerator >> 8); |
| result[start + 0] = (byte) (value.numerator >> 0); |
| result[start + 7] = (byte) (value.divisor >> 24); |
| result[start + 6] = (byte) (value.divisor >> 16); |
| result[start + 5] = (byte) (value.divisor >> 8); |
| result[start + 4] = (byte) (value.divisor >> 0); |
| } |
| } |
| return result; |
| } |
| |
| public static short convertToShort(byte[] bytes, int byteOrder) { |
| return convertToShort(bytes, 0, byteOrder); |
| } |
| |
| public static short convertToShort(byte[] bytes, int offset, int byteOrder) { |
| int byte0 = 0xff & bytes[offset + 0]; |
| int byte1 = 0xff & bytes[offset + 1]; |
| if (byteOrder == BYTE_ORDER_MOTOROLA) { |
| return (short) ((byte0 << 8) | byte1); |
| } else { |
| return (short) ((byte1 << 8) | byte0); |
| } |
| } |
| |
| public static short[] convertToShortArray(byte[] bytes, int byteOrder) { |
| return convertToShortArray(bytes, 0, bytes.length, byteOrder); |
| } |
| |
| public static short[] convertToShortArray(byte[] bytes, int length, int byteOrder) { |
| return convertToShortArray(bytes, 0, length, byteOrder); |
| } |
| |
| public static short[] convertToShortArray(byte[] bytes, int offset, int length, int byteOrder) { |
| short[] result = new short[length / 2]; |
| for (int i = 0; i < result.length; i++) { |
| result[i] = convertToShort(bytes, offset + 2*i, byteOrder); |
| } |
| return result; |
| } |
| |
| public static int convertToInt(byte[] bytes, int byteOrder) { |
| return convertToInt(bytes, 0, byteOrder); |
| } |
| |
| public static int convertToInt(byte[] bytes, int offset, int byteOrder) { |
| int byte0 = 0xff & bytes[offset + 0]; |
| int byte1 = 0xff & bytes[offset + 1]; |
| int byte2 = 0xff & bytes[offset + 2]; |
| int byte3 = 0xff & bytes[offset + 3]; |
| if (byteOrder == BYTE_ORDER_MOTOROLA) { |
| return (byte0 << 24) | (byte1 << 16) | |
| (byte2 << 8) | byte3; |
| } else { |
| return (byte3 << 24) | (byte2 << 16) | |
| (byte1 << 8) | byte0; |
| } |
| } |
| |
| public static int[] convertToIntArray(byte[] bytes, int byteOrder) { |
| return convertToIntArray(bytes, 0, bytes.length, byteOrder); |
| } |
| |
| public static int[] convertToIntArray(byte[] bytes, int length, int byteOrder) { |
| return convertToIntArray(bytes, 0, length, byteOrder); |
| } |
| |
| public static int[] convertToIntArray(byte[] bytes, int offset, int length, int byteOrder) { |
| int[] result = new int[length / 4]; |
| for (int i = 0; i < result.length; i++) { |
| result[i] = convertToInt(bytes, offset + 4*i, byteOrder); |
| } |
| return result; |
| } |
| |
| public static float convertToFloat(byte[] bytes, int byteOrder) { |
| return convertToFloat(bytes, 0, byteOrder); |
| } |
| |
| public static float convertToFloat(byte[] bytes, int offset, int byteOrder) { |
| int byte0 = 0xff & bytes[offset + 0]; |
| int byte1 = 0xff & bytes[offset + 1]; |
| int byte2 = 0xff & bytes[offset + 2]; |
| int byte3 = 0xff & bytes[offset + 3]; |
| int bits; |
| if (byteOrder == BYTE_ORDER_MOTOROLA) { |
| bits = (byte0 << 24) | (byte1 << 16) | |
| (byte2 << 8) | (byte3 << 0); |
| } else { |
| bits = (byte3 << 24) | (byte2 << 16) | |
| (byte1 << 8) | (byte0 << 0); |
| } |
| return Float.intBitsToFloat(bits); |
| } |
| |
| public static float[] convertToFloatArray(byte[] bytes, int byteOrder) { |
| return convertToFloatArray(bytes, 0, bytes.length, byteOrder); |
| } |
| |
| public static float[] convertToFloatArray(byte[] bytes, int length, int byteOrder) { |
| return convertToFloatArray(bytes, 0, length, byteOrder); |
| } |
| |
| public static float[] convertToFloatArray(byte[] bytes, int offset, int length, int byteOrder) { |
| float[] result = new float[length / 4]; |
| for (int i = 0; i < result.length; i++) { |
| result[i] = convertToFloat(bytes, offset + 4*i, byteOrder); |
| } |
| return result; |
| } |
| |
| public static double convertToDouble(byte[] bytes, int byteOrder) { |
| return convertToDouble(bytes, 0, byteOrder); |
| } |
| |
| public static double convertToDouble(byte[] bytes, int offset, int byteOrder) { |
| long byte0 = 0xffL & bytes[offset + 0]; |
| long byte1 = 0xffL & bytes[offset + 1]; |
| long byte2 = 0xffL & bytes[offset + 2]; |
| long byte3 = 0xffL & bytes[offset + 3]; |
| long byte4 = 0xffL & bytes[offset + 4]; |
| long byte5 = 0xffL & bytes[offset + 5]; |
| long byte6 = 0xffL & bytes[offset + 6]; |
| long byte7 = 0xffL & bytes[offset + 7]; |
| long bits; |
| if (byteOrder == BYTE_ORDER_MOTOROLA) { |
| bits = (byte0 << 56) | (byte1 << 48) | |
| (byte2 << 40) | (byte3 << 32) | |
| (byte4 << 24) | (byte5 << 16) | |
| (byte6 << 8) | (byte7 << 0); |
| } else { |
| bits = (byte7 << 56) | (byte6 << 48) | |
| (byte5 << 40) | (byte4 << 32) | |
| (byte3 << 24) | (byte2 << 16) | |
| (byte1 << 8) | (byte0 << 0); |
| } |
| return Double.longBitsToDouble(bits); |
| } |
| |
| public static double[] convertToDoubleArray(byte[] bytes, int byteOrder) { |
| return convertToDoubleArray(bytes, 0, bytes.length, byteOrder); |
| } |
| |
| public static double[] convertToDoubleArray(byte[] bytes, int length, int byteOrder) { |
| return convertToDoubleArray(bytes, 0, length, byteOrder); |
| } |
| |
| public static double[] convertToDoubleArray(byte[] bytes, int offset, int length, int byteOrder) { |
| double[] result = new double[length / 8]; |
| for (int i = 0; i < result.length; i++) { |
| result[i] = convertToDouble(bytes, offset + 8*i, byteOrder); |
| } |
| return result; |
| } |
| |
| public static RationalNumber convertToRational(byte[] bytes, int byteOrder) { |
| return convertToRational(bytes, 0, byteOrder); |
| } |
| |
| public static RationalNumber convertToRational(byte[] bytes, int offset, int byteOrder) { |
| int byte0 = 0xff & bytes[offset + 0]; |
| int byte1 = 0xff & bytes[offset + 1]; |
| int byte2 = 0xff & bytes[offset + 2]; |
| int byte3 = 0xff & bytes[offset + 3]; |
| int byte4 = 0xff & bytes[offset + 4]; |
| int byte5 = 0xff & bytes[offset + 5]; |
| int byte6 = 0xff & bytes[offset + 6]; |
| int byte7 = 0xff & bytes[offset + 7]; |
| int numerator; |
| int divisor; |
| if (byteOrder == BYTE_ORDER_MOTOROLA) { |
| numerator = (byte0 << 24) | (byte1 << 16) | |
| (byte2 << 8) | byte3; |
| divisor = (byte4 << 24) | (byte5 << 16) | |
| (byte6 << 8) | byte7; |
| } else { |
| numerator = (byte3 << 24) | (byte2 << 16) | |
| (byte1 << 8) | byte0; |
| divisor = (byte7 << 24) | (byte6 << 16) | |
| (byte5 << 8) | byte4; |
| } |
| return new RationalNumber(numerator, divisor); |
| } |
| |
| public static RationalNumber[] convertToRationalArray(byte[] bytes, int byteOrder) { |
| return convertToRationalArray(bytes, 0, bytes.length, byteOrder); |
| } |
| |
| public static RationalNumber[] convertToRationalArray(byte[] bytes, int length, int byteOrder) { |
| return convertToRationalArray(bytes, 0, length, byteOrder); |
| } |
| |
| public static RationalNumber[] convertToRationalArray(byte[] bytes, int offset, int length, int byteOrder) { |
| RationalNumber[] result = new RationalNumber[length / 8]; |
| for (int i = 0; i < result.length; i++) { |
| result[i] = convertToRational(bytes, offset + 8*i, byteOrder); |
| } |
| return result; |
| } |
| } |