@@ -148,12 +148,16 @@ private void readFromByteBuffer(ByteBuffer buffer, HdfDataFile hdfDataFile) {
148148 buffer .mark ();
149149 String name = HdfReadUtils .readNullTerminatedString (buffer );
150150
151+ long offset ;
151152 if ( version != 3 ) {
152153 // Align to 8-byte boundary
153154 alignBufferTo8ByteBoundary (buffer , name .length () + 1 );
155+ offset = buffer .getInt ();
156+ } else {
157+ //TODO:Assuming I need to check this for all datatypes
158+ offset = readNumberOfMembers (buffer , numberOfMembers );
154159 }
155160
156- int offset = buffer .getInt ();
157161 int dimensionality ;
158162 int [] dimensionSizes = new int [4 ];
159163 int dimensionPermutation = 0 ;
@@ -177,6 +181,7 @@ private void readFromByteBuffer(ByteBuffer buffer, HdfDataFile hdfDataFile) {
177181 throw new UnsupportedOperationException ("Unsupported classAndVersion: " + classAndVersion );
178182 }
179183
184+
180185 CompoundMemberDatatype compoundMemberDatatype = new CompoundMemberDatatype (
181186 name ,
182187 offset ,
@@ -191,6 +196,53 @@ private void readFromByteBuffer(ByteBuffer buffer, HdfDataFile hdfDataFile) {
191196 }
192197 }
193198
199+ public static long readNumberOfMembers (ByteBuffer buffer , long elementSize ) {
200+ // // Set ByteBuffer to Little Endian
201+ // buffer.order(ByteOrder.LITTLE_ENDIAN);
202+
203+ // Determine the field size based on elementSize
204+ int fieldSize ;
205+ if (elementSize < 256 ) {
206+ fieldSize = 1 ; // 1 byte
207+ } else if (elementSize < 65536 ) {
208+ fieldSize = 2 ; // 2 bytes
209+ } else if (elementSize < 16777216 ) {
210+ fieldSize = 3 ; // 3 bytes
211+ } else if (elementSize < 4294967296L ) {
212+ fieldSize = 4 ; // 4 bytes
213+ } else {
214+ fieldSize = 8 ; // 8 bytes
215+ }
216+
217+ // Read the appropriate number of bytes and convert to long
218+ long numberOfMembers ;
219+ switch (fieldSize ) {
220+ case 1 :
221+ numberOfMembers = buffer .get () & 0xFF ; // Read 1 byte, unsigned
222+ break ;
223+ case 2 :
224+ numberOfMembers = buffer .getShort () & 0xFFFF ; // Read 2 bytes, unsigned
225+ break ;
226+ case 3 :
227+ // Read 3 bytes manually (ByteBuffer doesn't have a direct 3-byte read)
228+ byte [] bytes3 = new byte [3 ];
229+ buffer .get (bytes3 );
230+ numberOfMembers = ((bytes3 [2 ] & 0xFFL ) << 16 ) |
231+ ((bytes3 [1 ] & 0xFFL ) << 8 ) |
232+ (bytes3 [0 ] & 0xFFL );
233+ break ;
234+ case 4 :
235+ numberOfMembers = buffer .getInt () & 0xFFFFFFFFL ; // Read 4 bytes, unsigned
236+ break ;
237+ case 8 :
238+ numberOfMembers = buffer .getLong (); // Read 8 bytes
239+ break ;
240+ default :
241+ throw new IllegalStateException ("Invalid field size: " + fieldSize );
242+ }
243+
244+ return numberOfMembers ;
245+ }
194246
195247 private static void alignBufferTo8ByteBoundary (ByteBuffer buffer , int dataLength ) {
196248 int padding = (8 - (dataLength % 8 )) % 8 ;
@@ -202,9 +254,9 @@ private byte[][] toByteArrayArray(byte[] bytes) {
202254 byte [][] result = new byte [members .size ()][];
203255 for (int i = 0 ; i < members .size (); i ++) {
204256 CompoundMemberDatatype member = members .get (i );
205- int offset = member .getOffset ();
257+ long offset = member .getOffset ();
206258 int memberSize = member .getSize ();
207- result [i ] = Arrays .copyOfRange (bytes , offset , offset + memberSize );
259+ result [i ] = Arrays .copyOfRange (bytes , Math . toIntExact ( offset ), Math . toIntExact ( offset + memberSize ) );
208260 }
209261 return result ;
210262 }
@@ -214,9 +266,9 @@ private HdfData[] toHdfDataArray(byte[] bytes) throws IOException, InvocationTar
214266 HdfData [] result = new HdfData [members .size ()];
215267 for (int i = 0 ; i < members .size (); i ++) {
216268 CompoundMemberDatatype member = members .get (i );
217- int offset = member .getOffset ();
269+ long offset = member .getOffset ();
218270 int memberSize = member .getSize ();
219- byte [] memberBytes = Arrays .copyOfRange (bytes , offset , offset + memberSize );
271+ byte [] memberBytes = Arrays .copyOfRange (bytes , Math . toIntExact ( offset ), Math . toIntExact ( offset + memberSize ) );
220272 result [i ] = member .getInstance (HdfData .class , memberBytes );
221273 }
222274 return result ;
@@ -395,7 +447,7 @@ private <T> T createRecordInstance(Class<T> clazz, byte[] bytes,
395447 CompoundMemberDatatype member = nameToMemberMap .get (componentName );
396448 if (member != null ) {
397449 Object value = member .getInstance (paramTypes [i ], Arrays .copyOfRange (
398- bytes , member .getOffset (), member .getOffset () + member .getSize ()));
450+ bytes , Math . toIntExact ( member .getOffset ()), Math . toIntExact ( member .getOffset () + member .getSize () )));
399451 if (paramTypes [i ].isAssignableFrom (value .getClass ())) {
400452 args [i ] = value ;
401453 } else {
@@ -447,7 +499,7 @@ private <T> T createClassInstance(Class<T> clazz, byte[] bytes,
447499 Field field = nameToFieldMap .get (member .getName ());
448500 if (field != null ) {
449501 Object value = member .getInstance (field .getType (), Arrays .copyOfRange (
450- bytes , member .getOffset (), member .getOffset () + member .getSize ()));
502+ bytes , Math . toIntExact ( member .getOffset ()), Math . toIntExact ( member .getOffset () + member .getSize () )));
451503 if (field .getType ().isAssignableFrom (value .getClass ())) {
452504 field .setAccessible (true );
453505 field .set (instance , value );
@@ -486,7 +538,7 @@ public void setGlobalHeap(HdfGlobalHeap globalHeap) {
486538 public String toString (byte [] bytes ) throws IOException , InvocationTargetException , InstantiationException , IllegalAccessException {
487539 StringJoiner joiner = new StringJoiner (", " );
488540 for (CompoundMemberDatatype m : members ) {
489- String string = m .toString (Arrays .copyOfRange (bytes , m .getOffset (), m .getOffset () + m .getSize ()));
541+ String string = m .toString (Arrays .copyOfRange (bytes , Math . toIntExact ( m .getOffset ()), Math . toIntExact ( m .getOffset () + m .getSize () )));
490542 joiner .add (string );
491543 }
492544 return joiner .toString ();
0 commit comments