blob: e78281dd15661006bc4bb630195aa84b41b05501 [file] [log] [blame]
/*
* 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;
}
}