package de.desy.tine.endianUtils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Arrays;
import de.desy.tine.definitions.TErrorList;
import de.desy.tine.definitions.TFormat;
import de.desy.tine.exceptions.TineRuntimeErrorException;
import de.desy.tine.server.logger.MsgLog;
public final class Swap
{
public static short Short(short sval)
{
int ival = sval;
if (ival < 0) ival += 65536;
int tmp = (ival << 8) | (ival >>> 8) & 0xffff;
return (short) tmp;
}
public static short Short(int ival)
{
ival = ival & 0xffff;
if (ival > 32767) ival -= 65536;
int tmp = (ival << 8) | (ival >>> 8) & 0xffff;
return (short) tmp;
}
public static short[] ShortArray(byte[] barr)
{
if (barr == null) return null;
int len = barr.length;
if ((len % 2) != 0) throw new TineRuntimeErrorException(TErrorList.dimension_error);
short[] sa = new short[len/2];
byte b1;
for (int i=0; i<len; i += 2)
{
b1 = barr[i];
barr[i] = barr[i+1];
barr[i+1] = b1;
}
try
{
ByteArrayInputStream bs = new ByteArrayInputStream(barr);
DataInputStream ds = new DataInputStream(bs);
len /= 2;
for (int i=0; i<len; i++)
{
sa[i] = ds.readShort();
}
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read int value from stream",TErrorList.code_failure,e,0);
return null;
}
return sa;
}
public static int Long(int ival)
{
int tmp = ((ival >>> 24) | (ival << 24) | ((ival & 0xff00) << 8) | ((ival & 0x00ff0000) >>> 8));
return tmp;
}
public static int Long(long lval)
{
if (lval > 2147483647) lval -= 4294967296L;
long tmp = ((lval >>> 24) | (lval << 24) | ((lval & 0xff00) << 8) | ((lval & 0x00ff0000) >>> 8));
tmp &= 0xffffffff;
return (int)tmp;
}
public static int Long(byte[] barr)
{
byte b1, b2;
int ival = 0;
b1 = barr[0];
b2 = barr[1];
barr[0] = barr[3];
barr[1] = barr[2];
barr[2] = b2;
barr[3] = b1;
try
{
ByteArrayInputStream bs = new ByteArrayInputStream(barr);
DataInputStream ds = new DataInputStream(bs);
ival = ds.readInt();
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read int value from stream",TErrorList.code_failure,e,0);
return 0;
}
return ival;
}
public static int[] IntArray(byte[] barr)
{
if (barr == null) return null;
int len = barr.length;
if ((len % 4) != 0) throw new TineRuntimeErrorException(TErrorList.dimension_error);
int[] ia = new int[len/4];
byte b1, b2;
for (int i=0; i<len; i += 4)
{
b1 = barr[i];
b2 = barr[i+1];
barr[i] = barr[i+3];
barr[i+1] = barr[i+2];
barr[i+2] = b2;
barr[i+3] = b1;
}
try
{
ByteArrayInputStream bs = new ByteArrayInputStream(barr);
DataInputStream ds = new DataInputStream(bs);
len /= 4;
for (int i=0; i<len; i++)
{
ia[i] = ds.readInt();
}
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read int value from stream",TErrorList.code_failure,e,0);
return null;
}
return ia;
}
public static long DLong(byte[] barr)
{
long lv = 0;
byte b1,b2,b3,b4;
try
{
b1 = barr[0];
b2 = barr[1];
b3 = barr[2];
b4 = barr[3];
barr[0] = barr[7];
barr[1] = barr[6];
barr[2] = barr[5];
barr[3] = barr[4];
barr[4] = b4;
barr[5] = b3;
barr[6] = b2;
barr[7] = b1;
ByteArrayInputStream bs = new ByteArrayInputStream(barr);
DataInputStream ds = new DataInputStream(bs);
lv = ds.readLong();
ds.close();
bs.close();
}
catch (Exception e)
{
e.printStackTrace();
MsgLog.log("Swap.DLong",e.getMessage(),TErrorList.code_failure,e,0);
}
return lv;
}
public static long DLong(long lval)
{
byte[] lba = DLongToBytes(lval);
long lv = 0;
try
{
ByteArrayInputStream bs = new ByteArrayInputStream(lba);
DataInputStream ds = new DataInputStream(bs);
lv = ds.readLong();
ds.close();
bs.close();
}
catch (Exception e)
{
e.printStackTrace();
MsgLog.log("Swap.DLong",e.toString(),TErrorList.code_failure,e,0);
}
return lv;
}
public static byte[] DLongToBytes(long lval)
{
byte b1, b2, b3, b4, barr[];
try
{
ByteArrayOutputStream bs = new ByteArrayOutputStream(8);
DataOutputStream ds = new DataOutputStream(bs);
ds.writeLong(lval);
barr = bs.toByteArray();
b1 = barr[0];
b2 = barr[1];
b3 = barr[2];
b4 = barr[3];
barr[0] = barr[7];
barr[1] = barr[6];
barr[2] = barr[5];
barr[3] = barr[4];
barr[4] = b4;
barr[5] = b3;
barr[6] = b2;
barr[7] = b1;
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read double value from stream",TErrorList.code_failure,e,0);
return null;
}
return barr;
}
public static byte[] LongToBytes(int ival)
{
byte b1, b2, barr[];
try
{
ByteArrayOutputStream bs = new ByteArrayOutputStream(4);
DataOutputStream ds = new DataOutputStream(bs);
ds.writeInt(ival);
barr = bs.toByteArray();
b1 = barr[0];
b2 = barr[1];
barr[0] = barr[3];
barr[1] = barr[2];
barr[2] = b2;
barr[3] = b1;
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read int value from stream",TErrorList.code_failure,e,0);
return null;
}
return barr;
}
public static byte[] ShortToBytes(int ival)
{
ival = ival & 0xffff;
if (ival > 32767) ival -= 65536;
short sval = (short)ival;
byte b1, barr[];
try
{
ByteArrayOutputStream bs = new ByteArrayOutputStream(2);
DataOutputStream ds = new DataOutputStream(bs);
ds.writeShort(sval);
barr = bs.toByteArray();
b1 = barr[0];
barr[0] = barr[1];
barr[1] = b1;
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read int value from stream",TErrorList.code_failure,e,0);
return null;
}
return barr;
}
public static byte[] Float(float fval)
{
byte b1, b2, barr[];
try
{
ByteArrayOutputStream bs = new ByteArrayOutputStream(4);
DataOutputStream ds = new DataOutputStream(bs);
ds.writeFloat(fval);
barr = bs.toByteArray();
b1 = barr[0];
b2 = barr[1];
barr[0] = barr[3];
barr[1] = barr[2];
barr[2] = b2;
barr[3] = b1;
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read float value from stream",TErrorList.code_failure,e,0);
return null;
}
return barr;
}
public static byte[] FloatArray(float[] farr)
{
if (farr == null) return null;
byte b1, b2, barr[];
try
{
ByteArrayOutputStream bs = new ByteArrayOutputStream(farr.length*4);
DataOutputStream ds = new DataOutputStream(bs);
for (int i=0; i<farr.length; i++) ds.writeFloat(farr[i]);
barr = bs.toByteArray();
for (int i=0; i<barr.length; i += 4)
{
b1 = barr[i];
b2 = barr[i+1];
barr[i] = barr[i+3];
barr[i+1] = barr[i+2];
barr[i+2] = b2;
barr[i+3] = b1;
}
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read float value from stream",TErrorList.code_failure,e,0);
return null;
}
return barr;
}
public static float[] FloatArray(byte[] barr)
{
if (barr == null) return null;
int len = barr.length;
if ((len % 4) != 0) throw new TineRuntimeErrorException(TErrorList.dimension_error);
float[] fa = new float[len/4];
byte b1, b2;
for (int i=0; i<len; i += 4)
{
b1 = barr[i];
b2 = barr[i+1];
barr[i] = barr[i+3];
barr[i+1] = barr[i+2];
barr[i+2] = b2;
barr[i+3] = b1;
}
try
{
ByteArrayInputStream bs = new ByteArrayInputStream(barr);
DataInputStream ds = new DataInputStream(bs);
len /= 4;
for (int i=0; i<len; i++)
{
fa[i] = ds.readFloat();
}
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read float value from stream",TErrorList.code_failure,e,0);
return null;
}
return fa;
}
public static float Float(byte[] barr)
{
byte b1, b2;
int len = 4;
for (int i = 0; i < len; i += 4)
{
b1 = barr[i];
b2 = barr[i + 1];
barr[i] = barr[i + 3];
barr[i + 1] = barr[i + 2];
barr[i + 2] = b2;
barr[i + 3] = b1;
}
float fltval = 0;
try
{
ByteArrayInputStream bs = new ByteArrayInputStream(barr);
DataInputStream ds = new DataInputStream(bs);
fltval = ds.readFloat();
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read float value from stream",TErrorList.code_failure,e,0);
return 0;
}
return fltval;
}
public static byte[] Double(double dval)
{
byte b1, b2, b3, b4, barr[];
try
{
ByteArrayOutputStream bs = new ByteArrayOutputStream(8);
DataOutputStream ds = new DataOutputStream(bs);
ds.writeDouble(dval);
barr = bs.toByteArray();
b1 = barr[0];
b2 = barr[1];
b3 = barr[2];
b4 = barr[3];
barr[0] = barr[7];
barr[1] = barr[6];
barr[2] = barr[5];
barr[3] = barr[4];
barr[4] = b4;
barr[5] = b3;
barr[6] = b2;
barr[7] = b1;
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read double value from stream",TErrorList.code_failure,e,0);
return null;
}
return barr;
}
public static double Double(byte[] barr)
{
byte b1, b2, b3, b4;
int len = 8;
for (int i = 0; i < len; i += 8)
{
b1 = barr[i];
b2 = barr[i + 1];
b3 = barr[i + 2];
b4 = barr[i + 3];
barr[i] = barr[i + 7];
barr[i + 1] = barr[i + 6];
barr[i + 2] = barr[i + 5];
barr[i + 3] = barr[i + 4];
barr[i + 4] = b4;
barr[i + 5] = b3;
barr[i + 6] = b2;
barr[i + 7] = b1;
}
double dblval = 0;
try
{
ByteArrayInputStream bs = new ByteArrayInputStream(barr);
DataInputStream ds = new DataInputStream(bs);
dblval = ds.readDouble();
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read double value from stream",TErrorList.code_failure,e,0);
return 0;
}
return dblval;
}
public static double[] DoubleArray(byte[] barr)
{
if (barr == null) return null;
int len = barr.length;
if ((len % 8) != 0) throw new TineRuntimeErrorException(TErrorList.dimension_error);
double[] da = new double[len/8];
byte b1, b2, b3, b4;
for (int i=0; i<len; i += 8)
{
b1 = barr[i];
b2 = barr[i+1];
barr[i] = barr[i+3];
barr[i+1] = barr[i+2];
barr[i+2] = b2;
barr[i+3] = b1;
b1 = barr[i];
b2 = barr[i+1];
b3 = barr[i+2];
b4 = barr[i+3];
barr[i] = barr[i+7];
barr[i+1] = barr[i+6];
barr[i+2] = barr[i+5];
barr[i+3] = barr[i+4];
barr[i+4] = b4;
barr[i+5] = b3;
barr[i+6] = b2;
barr[i+7] = b1;
}
try
{
ByteArrayInputStream bs = new ByteArrayInputStream(barr);
DataInputStream ds = new DataInputStream(bs);
len /= 8;
for (int i=0; i<len; i++)
{
da[i] = ds.readDouble();
}
ds.close();
bs.close();
}
catch (IOException e)
{
e.printStackTrace();
MsgLog.log("Swap","could not read float value from stream",TErrorList.code_failure,e,0);
return null;
}
return da;
}
public static void Bytes(byte[] barr, int bounds)
{
if (bounds <= 0) return;
if ((barr.length % bounds) != 0) return;
int len = barr.length;
byte b1, b2, b3, b4;
switch (bounds)
{
default:
case 1:
return;
case 2:
for (int i = 0; i < len; i += 2)
{
b1 = barr[i];
barr[i] = barr[i + 1];
barr[i + 1] = b1;
}
return;
case 4:
for (int i = 0; i < len; i += 4)
{
b1 = barr[i];
b2 = barr[i + 1];
barr[i] = barr[i + 3];
barr[i + 1] = barr[i + 2];
barr[i + 2] = b2;
barr[i + 3] = b1;
}
return;
case 8:
for (int i = 0; i < len; i += 8)
{
b1 = barr[i];
b2 = barr[i + 1];
b3 = barr[i + 2];
b4 = barr[i + 3];
barr[i] = barr[i + 7];
barr[i + 1] = barr[i + 6];
barr[i + 2] = barr[i + 5];
barr[i + 3] = barr[i + 4];
barr[i + 4] = b4;
barr[i + 5] = b3;
barr[i + 6] = b2;
barr[i + 7] = b1;
}
return;
}
}
public static void Bytes(byte[] barr, short fmt)
{
int len;
byte b1, b2;
switch (fmt)
{
default:
case TFormat.CF_BYTE:
break;
case TFormat.CF_DLONG:
case TFormat.CF_DBLDBL:
case TFormat.CF_DBLTIME:
case TFormat.CF_DOUBLE:
Bytes(barr, 8);
break;
case TFormat.CF_SHORT:
Bytes(barr, 2);
break;
case TFormat.CF_LONG:
Bytes(barr, 4);
break;
case TFormat.CF_FLOAT:
Bytes(barr, 4);
break;
case TFormat.CF_SPECTRUM:
if (barr.length < 96) return;
len = barr.length;
for (int i = 20; i < len; i += 4)
{
b1 = barr[i];
b2 = barr[i + 1];
barr[i] = barr[i + 3];
barr[i + 1] = barr[i + 2];
barr[i + 2] = b2;
barr[i + 3] = b1;
}
break;
case TFormat.CF_USTRING:
if ((barr.length % 96) != 0) return;
len = barr.length;
for (int i = 0; i < len; i += 96)
{
b1 = barr[i];
b2 = barr[i + 1];
barr[i] = barr[i + 3];
barr[i + 1] = barr[i + 2];
barr[i + 2] = b2;
barr[i + 3] = b1;
b1 = barr[i + 4];
b2 = barr[i + 5];
barr[i + 4] = barr[i + 7];
barr[i + 5] = barr[i + 6];
barr[i + 6] = b2;
barr[i + 7] = b1;
b1 = barr[i + 8];
b2 = barr[i + 9];
barr[i + 8] = barr[i + 11];
barr[i + 9] = barr[i + 10];
barr[i + 10] = b2;
barr[i + 11] = b1;
b1 = barr[i + 12];
b2 = barr[i + 13];
barr[i + 12] = barr[i + 15];
barr[i + 13] = barr[i + 14];
barr[i + 14] = b2;
barr[i + 15] = b1;
}
break;
case TFormat.CF_NAME16FI:
if ((barr.length % 24) != 0) return;
len = barr.length;
for (int i = 0; i < len; i += 24)
{
b1 = barr[i + 16];
b2 = barr[i + 17];
barr[i + 16] = barr[i + 19];
barr[i + 17] = barr[i + 18];
barr[i + 18] = b2;
barr[i + 19] = b1;
b1 = barr[i + 20];
b2 = barr[i + 21];
barr[i + 20] = barr[i + 23];
barr[i + 21] = barr[i + 22];
barr[i + 22] = b2;
barr[i + 23] = b1;
}
break;
case TFormat.CF_FLTINT:
Bytes(barr, 4);
break;
case TFormat.CF_INTINT:
Bytes(barr, 4);
break;
case TFormat.CF_FLTFLTINT:
Bytes(barr, 4);
break;
case TFormat.CF_INTFLTINT:
Bytes(barr, 4);
break;
case TFormat.CF_INTFLTFLTFLT:
Bytes(barr, 4);
break;
}
return;
}
/* */
public static void Bytes(byte[] barr, String tag)
{
int bounds;
byte b1, b2, b3, b4;
if (tag.compareTo("AESNOT") == 0)
{
bounds = 4 * 4 + 4 * 64; // size of AESnotify structure
if (barr.length % bounds != 0) return;
for (int i = 0; i < barr.length; i += bounds)
{
// 4 UINT32 values ...
for (int j = 0; j < 16; j += 4)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
barr[i + j] = barr[i + j + 3];
barr[i + j + 1] = barr[i + j + 2];
barr[i + j + 2] = b2;
barr[i + j + 3] = b1;
}
// 256 8-bit characters (no swapping)
}
return;
}
if (tag.compareTo("AESCON") == 0)
{
bounds = 4 * 4 + 16; // size of AEScontext structure
if (barr.length % bounds != 0) return;
for (int i = 0; i < barr.length; i += bounds)
{
// 4 UINT32 values ...
for (int j = 0; j < 16; j += 4)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
barr[i + j] = barr[i + j + 3];
barr[i + j + 1] = barr[i + j + 2];
barr[i + j + 2] = b2;
barr[i + j + 3] = b1;
}
// 16 8-bit characters (no swapping)
}
return;
}
if (tag.compareTo("AES") == 0)
{
bounds = 2 * 4 + 4 * 64 + 32; // size of AES structure
if (barr.length % bounds != 0) return;
for (int i = 0; i < barr.length; i += bounds)
{
// 2 UINT32 values ...
for (int j = 0; j < 8; j += 4)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
barr[i + j] = barr[i + j + 3];
barr[i + j + 1] = barr[i + j + 2];
barr[i + j + 2] = b2;
barr[i + j + 3] = b1;
}
// 256 8-bit characters (no swapping)
// 32 bytes (no swapping)
}
return;
}
if (tag.compareTo("AIB") == 0)
{
bounds = 2 * 2 + 4 + 64; // size of Archive Info Block
if (barr.length % bounds != 0) return;
for (int i = 0, j = 0; i < barr.length; i += bounds)
{
// 2 UINT16 values ...
for (j = 0; j < 4; j += 2)
{
b1 = barr[i + j];
barr[i + j] = barr[i + j + 1];
barr[i + j + 1] = b1;
}
// 1 UINT32 value ...
for (int offset = j; j < 4 + offset; j += 4)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
barr[i + j] = barr[i + j + 3];
barr[i + j + 1] = barr[i + j + 2];
barr[i + j + 2] = b2;
barr[i + j + 3] = b1;
}
// 64 8-bit characters (no swapping)
}
return;
}
if (tag.compareTo("PIB") == 0)
{
bounds = 5 * 4 + 16 + 2 * 8 + 2 * 2; // size of Property Info Block
if (barr.length % bounds != 0) return;
for (int i = 0, j = 0; i < barr.length; i += bounds)
{
// 5 UINT32 or float values ...
for (j = 0; j < 20; j += 4)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
barr[i + j] = barr[i + j + 3];
barr[i + j + 1] = barr[i + j + 2];
barr[i + j + 2] = b2;
barr[i + j + 3] = b1;
}
// 16 8-bit characters (no swapping)
// 2 double values ...
for (int offset = j + 16; j < 16 + offset; j += 8)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
b3 = barr[i + j + 2];
b4 = barr[i + j + 3];
barr[i + j] = barr[i + j + 7];
barr[i + j + 1] = barr[i + j + 6];
barr[i + j + 2] = barr[i + j + 5];
barr[i + j + 3] = barr[i + j + 4];
barr[i + j + 4] = b4;
barr[i + j + 5] = b3;
barr[i + j + 6] = b2;
barr[i + j + 7] = b1;
}
// 2 UINT16 values ...
for (int offset = j; j < 4 + offset; j += 2)
{
b1 = barr[i + j];
barr[i + j] = barr[i + j + 1];
barr[i + j + 1] = b1;
}
}
return;
}
if (tag.compareTo("DHS") == 0)
{ // size of Data Header Structure
bounds = 32 + 4 + 2 * 2 + 4 + 4 * 4 + 16 + 4 * 2 + 4 + 4 * 64;
if (barr.length % bounds != 0) return;
for (int i = 0, j = 0; i < barr.length; i += bounds)
{ // 32 8-bit characters (no swapping)
// 1 UINT32 or float values ...
for (int offset = 32; j < 4 + offset; j += 4)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
barr[i + j] = barr[i + j + 3];
barr[i + j + 1] = barr[i + j + 2];
barr[i + j + 2] = b2;
barr[i + j + 3] = b1;
}
// 2 UINT16 values ...
for (int offset = j; j < 4 + offset; j += 2)
{
b1 = barr[i + j];
barr[i + j] = barr[i + j + 1];
barr[i + j + 1] = b1;
}
// 5 UINT32 or float values ...
for (int offset = j; j < 20 + offset; j += 4)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
barr[i + j] = barr[i + j + 3];
barr[i + j + 1] = barr[i + j + 2];
barr[i + j + 2] = b2;
barr[i + j + 3] = b1;
}
// 16 8-bit characters (no swapping)
// 2 UINT32 or float values ...
for (int offset = j + 16; j < 8 + offset; j += 4)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
barr[i + j] = barr[i + j + 3];
barr[i + j + 1] = barr[i + j + 2];
barr[i + j + 2] = b2;
barr[i + j + 3] = b1;
}
// 4 + 256 8-bit characters (no swapping)
}
return;
}
if (tag.compareTo("ADRB") == 0)
{
bounds = 3 * 4 + 3 * 16 + 2 * 2; // size of Archive Data Request Block
if (barr.length % bounds != 0) return;
for (int i = 0, j = 0; i < barr.length; i += bounds)
{
// 3 UINT32 values ...
for (int offset = j; j < 12 + offset; j += 4)
{
b1 = barr[i + j];
b2 = barr[i + j + 1];
barr[i + j] = barr[i + j + 3];
barr[i + j + 1] = barr[i + j + 2];
barr[i + j + 2] = b2;
barr[i + j + 3] = b1;
}
// 48 8-bit characters (no swapping)
// 2 UINT16 values ...
for (int offset = j + 48; j < 4 + offset; j += 2)
{
b1 = barr[i + j];
barr[i + j] = barr[i + j + 1];
barr[i + j + 1] = b1;
}
}
return;
}
return;
}
/* */
/* */
}