package com.netifera.platform.internal.system;
import java.nio.ByteOrder;
public class Bytesex {
private final boolean nativeBigEndian;
private final int[] index16; /* MSB to LSB */
private final int[] index32; /* MSB to LSB */
public Bytesex() {
nativeBigEndian = (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN);
if(nativeBigEndian) {
index16 = new int[] { 0, 1 };
index32 = new int[] { 0, 1, 2, 3 };
} else {
index16 = new int[] { 1, 0 };
index32 = new int[] { 3, 2, 1, 0 };
}
}
public int unpack32(byte[] data, int offset) {
int ret = 0;
ret |= (data[offset + index32[0]] & 0xFF);
ret <<= 8;
ret |= (data[offset + index32[1]] & 0xFF);
ret <<= 8;
ret |= (data[offset + index32[2]] & 0xFF);
ret <<= 8;
ret |= (data[offset + index32[3]] & 0xFF);
return ret;
}
public int unpack16(byte[] data, int offset) {
int ret = 0;
ret |= (data[offset + index16[0]] & 0xFF);
ret <<= 8;
ret |= (data[offset + index16[1]] & 0xFF);
return ret;
}
public void pack32(byte[] data, int offset, int value) {
data[offset + index32[0]] = (byte) (value >> 24);
data[offset + index32[1]] = (byte) (value >> 16);
data[offset + index32[2]] = (byte) (value >> 8);
data[offset + index32[3]] = (byte) (value);
}
public void pack16(byte[] data, int offset, int value) {
data[offset + index16[0]] = (byte) (value >> 8);
data[offset + index16[1]] = (byte) (value);
}
static public int swap16(int n) {
return ((n & 0xFF00) >> 8) | ((n & 0xFF) << 8);
}
static public int swap32(int n) {
return ((n & 0xFF) << 24) |
((n & 0xFF00) << 8) |
((n & 0xFF0000) >> 8) |
((n >>> 24) & 0xFF);
}
public int ntohs(int n) {
if(!nativeBigEndian) {
return swap16(n);
} else {
return n;
}
}
public int htons(int n) {
if(!nativeBigEndian) {
return swap16(n);
} else {
return n;
}
}
public int ntohl(int n) {
if(!nativeBigEndian) {
return swap32(n);
} else {
return n;
}
}
public int htonl(int n) {
if(!nativeBigEndian) {
return swap32(n);
} else {
return n;
}
}
}