11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.io.OutputStream;
14 import java.nio.ByteBuffer;
15 import java.nio.ByteOrder;
150 @SuppressWarnings(
"unchecked")
160 protected Integer getDefault() {
261 ByteBuffer bf = ByteBuffer.allocateDirect(
size());
284 if (byteBuffer.order() !=
byteOrder())
throw new IllegalArgumentException(
285 "The byte order of the specified byte buffer"
286 +
" is different from this struct byte order");
287 if (
_outer !=
null)
throw new UnsupportedOperationException(
288 "Inner struct byte buffer is inherited from outer");
332 public int read(InputStream in)
throws IOException {
335 int remaining =
size - buffer.position();
336 if (remaining == 0) remaining =
size;
337 int alreadyRead =
size - remaining;
338 if (buffer.hasArray()) {
341 .read(buffer.array(), offset + alreadyRead, remaining);
346 synchronized (buffer) {
350 int bytesRead = in.read(
_bytes, 0, remaining);
352 buffer.put(
_bytes, 0, bytesRead);
366 public void write(OutputStream out)
throws IOException {
368 if (buffer.hasArray()) {
370 out.write(buffer.array(), offset,
size());
372 synchronized (buffer) {
395 if (thisBuffer instanceof sun.nio.ch.DirectBuffer)
396 return ((sun.nio.ch.DirectBuffer)thisBuffer).address();
397 throw new UnsupportedOperationException();
425 for (
int i = 0; i <
size; i++) {
426 int b = buffer.get(start + i) & 0xFF;
429 tmp.
append(((i & 0xF) == 0xF) ?
'\n' :
' ');
434 private static final char[]
HEXA = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
435 '7',
'8',
'9',
'A',
'B',
'C',
'D',
'E',
'F' };
513 protected <S extends Struct> S
inner(S
struct) {
514 if (
struct.
_outer !=
null)
throw new IllegalArgumentException(
515 "struct: Already an inner struct");
517 struct._outer =
this;
518 struct._outerOffset =
inner.offset();
532 protected <S extends Struct> S[]
array(S[] structs) {
533 Class<?> structClass =
null;
539 for (
int i = 0; i < structs.length;) {
540 S
struct = structs[i];
541 if (
struct ==
null) {
543 if (structClass ==
null) {
544 String arrayName = structs.getClass().getName();
545 String structName = arrayName.substring(2,
546 arrayName.length() - 1);
547 structClass = Class.forName(structName);
548 if (structClass ==
null) {
throw new IllegalArgumentException(
549 "Struct class: " + structName +
" not found"); }
551 struct = (S) structClass.newInstance();
553 throw new RuntimeException(e.getMessage());
556 structs[i++] =
inner(
struct);
559 return (S[]) structs;
572 protected <S extends Struct> S[][]
array(S[][] structs) {
578 for (
int i = 0; i < structs.length; i++) {
582 return (S[][]) structs;
595 protected <S extends Struct> S[][][]
array(S[][][] structs) {
601 for (
int i = 0; i < structs.length; i++) {
605 return (S[][][]) structs;
618 protected <M extends Member> M[]
array(M[] arrayMember) {
624 if (
BOOL.isInstance(arrayMember)) {
625 for (
int i = 0; i < arrayMember.length;) {
626 arrayMember[i++] = (M) this.
new Bool();
628 }
else if (
SIGNED_8.isInstance(arrayMember)) {
629 for (
int i = 0; i < arrayMember.length;) {
630 arrayMember[i++] = (M) this.
new Signed8();
632 }
else if (
UNSIGNED_8.isInstance(arrayMember)) {
633 for (
int i = 0; i < arrayMember.length;) {
634 arrayMember[i++] = (M) this.
new Unsigned8();
636 }
else if (
SIGNED_16.isInstance(arrayMember)) {
637 for (
int i = 0; i < arrayMember.length;) {
638 arrayMember[i++] = (M) this.
new Signed16();
641 for (
int i = 0; i < arrayMember.length;) {
644 }
else if (
SIGNED_32.isInstance(arrayMember)) {
645 for (
int i = 0; i < arrayMember.length;) {
646 arrayMember[i++] = (M) this.
new Signed32();
649 for (
int i = 0; i < arrayMember.length;) {
652 }
else if (
SIGNED_64.isInstance(arrayMember)) {
653 for (
int i = 0; i < arrayMember.length;) {
654 arrayMember[i++] = (M) this.
new Signed64();
656 }
else if (
FLOAT_32.isInstance(arrayMember)) {
657 for (
int i = 0; i < arrayMember.length;) {
658 arrayMember[i++] = (M) this.
new Float32();
660 }
else if (
FLOAT_64.isInstance(arrayMember)) {
661 for (
int i = 0; i < arrayMember.length;) {
662 arrayMember[i++] = (M) this.
new Float64();
665 throw new UnsupportedOperationException(
666 "Cannot create member elements, the arrayMember should "
667 +
"contain the member instances instead of null");
670 return (M[]) arrayMember;
673 private static final Class<? extends Bool[]>
BOOL =
new Bool[0].getClass();
703 protected <M extends Member> M[][]
array(M[][] arrayMember) {
709 for (
int i = 0; i < arrayMember.length; i++) {
710 array(arrayMember[i]);
713 return (M[][]) arrayMember;
726 protected <M extends Member> M[][][]
array(M[][][] arrayMember) {
732 for (
int i = 0; i < arrayMember.length; i++) {
733 array(arrayMember[i]);
736 return (M[][][]) arrayMember;
753 for (
int i = 0; i <
array.length; i++) {
771 if ((bitOffset + bitSize - 1) >> 3 >= this.
size())
throw new IllegalArgumentException(
772 "Attempt to read outside the Struct");
773 int offset = bitOffset >> 3;
774 int bitStart = bitOffset - (offset << 3);
775 bitStart = (
byteOrder() == ByteOrder.BIG_ENDIAN) ? bitStart : 64
776 - bitSize - bitStart;
780 value >>= (64 - bitSize);
786 if (index + 8 < byteBuffer.limit())
return byteBuffer.getLong(index);
788 if (byteBuffer.order() == ByteOrder.LITTLE_ENDIAN) {
789 return (
readByte(index, byteBuffer) & 0xff)
790 + ((
readByte(++index, byteBuffer) & 0xff) << 8)
791 + ((
readByte(++index, byteBuffer) & 0xff) << 16)
792 + ((
readByte(++index, byteBuffer) & 0xffL) << 24)
793 + ((
readByte(++index, byteBuffer) & 0xffL) << 32)
794 + ((
readByte(++index, byteBuffer) & 0xffL) << 40)
795 + ((
readByte(++index, byteBuffer) & 0xffL) << 48)
796 + ((
readByte(++index, byteBuffer) & 0xffL) << 56);
798 return (((
long)
readByte(index, byteBuffer)) << 56)
799 + ((
readByte(++index, byteBuffer) & 0xffL) << 48)
800 + ((
readByte(++index, byteBuffer) & 0xffL) << 40)
801 + ((
readByte(++index, byteBuffer) & 0xffL) << 32)
802 + ((
readByte(++index, byteBuffer) & 0xffL) << 24)
803 + ((
readByte(++index, byteBuffer) & 0xff) << 16)
804 + ((
readByte(++index, byteBuffer) & 0xff) << 8)
805 + (
readByte(++index, byteBuffer) & 0xffL);
809 private static byte readByte(
int index, ByteBuffer byteBuffer) {
810 return (index < byteBuffer.limit()) ? byteBuffer.get(index) : 0;
822 public void writeBits(
long value,
int bitOffset,
int bitSize) {
823 if ((bitOffset + bitSize - 1) >> 3 >= this.
size())
throw new IllegalArgumentException(
824 "Attempt to write outside the Struct");
825 int offset = bitOffset >> 3;
826 int bitStart = (
byteOrder() == ByteOrder.BIG_ENDIAN) ? bitOffset
827 - (offset << 3) : 64 - bitSize - (bitOffset - (offset << 3));
830 mask >>>= (64 - bitSize);
831 mask <<= 64 - bitSize - bitStart;
832 value <<= (64 - bitSize - bitStart);
836 long resetValue = oldValue & (~mask);
837 long newValue = resetValue | value;
843 if (index + 8 < byteBuffer.limit()) {
844 byteBuffer.putLong(index, value);
848 if (byteBuffer.order() == ByteOrder.LITTLE_ENDIAN) {
849 writeByte(index, byteBuffer, (
byte) value);
850 writeByte(++index, byteBuffer, (
byte) (value >> 8));
851 writeByte(++index, byteBuffer, (
byte) (value >> 16));
852 writeByte(++index, byteBuffer, (
byte) (value >> 24));
853 writeByte(++index, byteBuffer, (
byte) (value >> 32));
854 writeByte(++index, byteBuffer, (
byte) (value >> 40));
855 writeByte(++index, byteBuffer, (
byte) (value >> 48));
856 writeByte(++index, byteBuffer, (
byte) (value >> 56));
858 writeByte(index, byteBuffer, (
byte) (value >> 56));
859 writeByte(++index, byteBuffer, (
byte) (value >> 48));
860 writeByte(++index, byteBuffer, (
byte) (value >> 40));
861 writeByte(++index, byteBuffer, (
byte) (value >> 32));
862 writeByte(++index, byteBuffer, (
byte) (value >> 24));
863 writeByte(++index, byteBuffer, (
byte) (value >> 16));
864 writeByte(++index, byteBuffer, (
byte) (value >> 8));
865 writeByte(++index, byteBuffer, (
byte) value);
869 private static void writeByte(
int index, ByteBuffer byteBuffer,
byte value) {
870 if (index < byteBuffer.limit()) {
871 byteBuffer.put(index, value);
956 int misaligned =
_index % wordSize;
957 if (misaligned != 0) {
958 _index += wordSize - misaligned;
1013 final int get(
int wordSize,
int word) {
1014 final int shift = (
byteOrder() == ByteOrder.BIG_ENDIAN) ? (wordSize << 3)
1018 int mask = 0xFFFFFFFF >>> (32 -
bitLength());
1023 final int set(
int value,
int wordSize,
int word) {
1024 final int shift = (
byteOrder() == ByteOrder.BIG_ENDIAN) ? (wordSize << 3)
1027 int mask = 0xFFFFFFFF >>> (32 -
bitLength());
1030 return (word & ~mask) | (value & mask);
1034 final long get(
int wordSize,
long word) {
1035 final int shift = (
byteOrder() == ByteOrder.BIG_ENDIAN) ? (wordSize << 3)
1039 long mask = 0xFFFFFFFFFFFFFFFFL >>> (64 -
bitLength());
1044 final long set(
long value,
int wordSize,
long word) {
1045 final int shift = (
byteOrder() == ByteOrder.BIG_ENDIAN) ? (wordSize << 3)
1048 long mask = 0xFFFFFFFFFFFFFFFFL >>> (64 -
bitLength());
1051 return (word & ~mask) | (value & mask);
1069 super(length << 3, 1);
1073 public void set(String string) {
1075 synchronized (buffer) {
1078 buffer.position(index);
1080 if (
string.length() <
_length) {
1083 }
else if (
string.length() >
_length) {
1088 }
catch (IOException e) {
1089 throw new Error(e.getMessage());
1096 public String
get() {
1098 synchronized (buffer) {
1102 buffer.position(index);
1104 for (
int i = 0; i <
_length; i++) {
1113 }
catch (IOException e) {
1114 throw new Error(e.getMessage());
1137 super(nbrOfBits, 1);
1140 public boolean get() {
1143 word = (
bitLength() == 8) ? word :
get(1, word);
1147 public void set(
boolean value) {
1160 return String.valueOf(this.
get());
1174 super(nbrOfBits, 1);
1180 return (
byte) ((
bitLength() == 8) ? word :
get(1, word));
1183 public void set(
byte value) {
1194 return String.valueOf(this.
get());
1208 super(nbrOfBits, 1);
1211 public short get() {
1214 return (
short) (0xFF & ((
bitLength() == 8) ? word :
get(1, word)));
1217 public void set(
short value) {
1228 return String.valueOf(this.
get());
1242 super(nbrOfBits, 2);
1245 public short get() {
1248 return (
short) ((
bitLength() == 16) ? word :
get(2, word));
1251 public void set(
short value) {
1262 return String.valueOf(this.
get());
1276 super(nbrOfBits, 2);
1282 return 0xFFFF & ((
bitLength() == 16) ? word :
get(2, word));
1285 public void set(
int value) {
1296 return String.valueOf(this.
get());
1310 super(nbrOfBits, 4);
1316 return (
bitLength() == 32) ? word :
get(4, word);
1319 public void set(
int value) {
1330 return String.valueOf(this.
get());
1344 super(nbrOfBits, 4);
1350 return 0xFFFFFFFFL & ((
bitLength() == 32) ? word :
get(4, word));
1353 public void set(
long value) {
1364 return String.valueOf(this.
get());
1378 super(nbrOfBits, 8);
1384 return (
bitLength() == 64) ? word :
get(8, word);
1387 public void set(
long value) {
1398 return String.valueOf(this.
get());
1409 super(nbrOfBits, 0);
1415 return ~(-1L <<
bitLength()) & signedValue;
1430 public void set(
long value) {
1448 public float get() {
1453 public void set(
float value) {
1459 return String.valueOf(this.
get());
1472 public double get() {
1477 public void set(
double value) {
1483 return String.valueOf(this.
get());
1505 public void set(S
struct) {
1507 if (
struct !=
null) {
1552 public void set(S
struct) {
1554 if (
struct !=
null) {
1556 }
else if (
struct ==
null) {
1593 public Enum8(T[] values,
int nbrOfBits) {
1594 super(nbrOfBits, 1);
1601 return _values[0xFF &
get(1, word)];
1604 public void set(T e) {
1605 int value = e.ordinal();
1606 if (
_values[value] != e)
throw new IllegalArgumentException(
1609 +
", ordinal value does not reflect enum values position");
1616 return String.valueOf(this.
get());
1633 super(nbrOfBits, 2);
1640 return _values[0xFFFF &
get(2, word)];
1643 public void set(T e) {
1644 int value = e.ordinal();
1645 if (
_values[value] != e)
throw new IllegalArgumentException(
1648 +
", ordinal value does not reflect enum values position");
1651 getByteBuffer().putShort(index, (
short)
set(value, 2, word));
1655 return String.valueOf(this.
get());
1672 super(nbrOfBits, 4);
1682 public void set(T e) {
1683 int value = e.ordinal();
1684 if (
_values[value] != e)
throw new IllegalArgumentException(
1687 +
", ordinal value does not reflect enum values position");
1694 return String.valueOf(this.
get());
1711 super(nbrOfBits, 8);
1718 return _values[(int)
get(8, word)];
1721 public void set(T e) {
1722 long value = e.ordinal();
1723 if (
_values[(
int) value] != e)
throw new IllegalArgumentException(
1726 +
", ordinal value does not reflect enum values position");
1733 return String.valueOf(this.
get());