Skip to content

Commit 798857e

Browse files
committed
Updates for v2 arch
1 parent 53b89a1 commit 798857e

6 files changed

Lines changed: 72 additions & 19 deletions

File tree

src/main/java/org/hdf5javalib/dataclass/HdfCompound.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public HdfCompound(byte[] bytes, CompoundDatatype datatype) {
5959
members = new ArrayList<>();
6060
datatype.getMembers().forEach(member -> {
6161
HdfCompoundMember hdfMember = new HdfCompoundMember(
62-
Arrays.copyOfRange(bytes, member.getOffset(), member.getOffset() + member.getSize()),
62+
Arrays.copyOfRange(bytes, Math.toIntExact(member.getOffset()), Math.toIntExact(member.getOffset() + member.getSize())),
6363
member
6464
);
6565
members.add(hdfMember);

src/main/java/org/hdf5javalib/datatype/CompoundDatatype.java

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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();

src/main/java/org/hdf5javalib/datatype/CompoundMemberDatatype.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class CompoundMemberDatatype implements Datatype {
3030
/**
3131
* The byte offset of the member within the compound datatype.
3232
*/
33-
private final int offset;
33+
private final long offset;
3434
/**
3535
* The number of dimensions for the member, if an array.
3636
*/
@@ -64,7 +64,7 @@ public class CompoundMemberDatatype implements Datatype {
6464
* @param datatype the base datatype of the member
6565
* @throws IllegalStateException if the datatype class is not supported
6666
*/
67-
public CompoundMemberDatatype(String name, int offset, int dimensionality, int dimensionPermutation, int[] dimensionSizes, Datatype datatype, HdfDataFile dataFile) {
67+
public CompoundMemberDatatype(String name, long offset, int dimensionality, int dimensionPermutation, int[] dimensionSizes, Datatype datatype, HdfDataFile dataFile) {
6868
this.name = name;
6969
this.offset = offset;
7070
this.dimensionality = dimensionality;
@@ -217,7 +217,7 @@ public void writeDefinitionToByteBuffer(ByteBuffer buffer) {
217217
buffer.put((byte) 0);
218218
int paddingSize = (8 - ((name.length() + 1) % 8)) % 8;
219219
buffer.put(new byte[paddingSize]);
220-
buffer.putInt(offset);
220+
buffer.putInt(Math.toIntExact(offset));
221221
buffer.put((byte) dimensionality);
222222
buffer.put(new byte[3]);
223223
buffer.putInt(dimensionPermutation);
@@ -317,7 +317,7 @@ public String getName() {
317317
return name;
318318
}
319319

320-
public int getOffset() {
320+
public long getOffset() {
321321
return offset;
322322
}
323323

src/main/java/org/hdf5javalib/examples/hdf5examples/HDF5Debug.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ private void run() {
4747
// List all .h5 files in HDF5Examples resources directory
4848
// ATL03_20250302235544_11742607_006_01
4949
// Path dirPath = Paths.get(Objects.requireNonNull(HDF5Debug.class.getClassLoader().getResource("HDF5Examples/h5ex_g_compact2.h5")).toURI());
50-
Path dirPath = Paths.get("c:/users/karnicho/Downloads/ATL03_20250302235544_11742607_007_01.h5");
50+
Path dirPath = Paths.get("c:/users/karln/Downloads/ATL03_20250302235544_11742607_007_01.h5");
51+
// Path dirPath = Paths.get("c:/users/karln/Downloads/ATL03_20250302235544_11742607_006_01.h5");
5152
processFile(dirPath);
5253
} catch (Exception e) {
5354
throw new IllegalStateException(e);

src/main/java/org/hdf5javalib/hdfjava/HdfFileReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public HdfFileReader readFile() throws Exception {
145145

146146
}
147147

148-
if (superblock.getVersion() < 2) {
148+
if (superblock.getVersion() < 2 && (rootGroupSTE.getCache() instanceof HdfSymbolTableEntryCacheWithScratch) ) {
149149
// Extract V1-specific metadata (heap and B-Tree addresses)
150150
long heapOffset = ((HdfSymbolTableEntryCacheWithScratch) rootGroupSTE.getCache()).getLocalHeapAddress().getInstance(Long.class);
151151
long bTreeAddress = ((HdfSymbolTableEntryCacheWithScratch) rootGroupSTE.getCache()).getbTreeAddress().getInstance(Long.class);

src/main/java/org/hdf5javalib/utils/HdfWriteUtils.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public static <T> void writeCompoundTypeToBuffer(T instance, CompoundDatatype co
107107
? StandardCharsets.US_ASCII : StandardCharsets.UTF_8;
108108
byte[] bytes = ((String) value).getBytes(charset);
109109
HdfString hdfString = new HdfString(bytes, membertyped);
110-
buffer.position(member.getOffset());
110+
buffer.position(Math.toIntExact(member.getOffset()));
111111
hdfString.writeValueToByteBuffer(buffer);
112112
} else if (memberType instanceof VariableLengthDatatype membertyped) {
113113
if (fieldType != String.class) {
@@ -120,17 +120,17 @@ public static <T> void writeCompoundTypeToBuffer(T instance, CompoundDatatype co
120120
byte[] varInstanceBytes = hdfGlobalHeap.addToHeap(bytes);
121121

122122
HdfVariableLength hdfVariableLength = new HdfVariableLength(varInstanceBytes, membertyped);
123-
buffer.position(member.getOffset());
123+
buffer.position(Math.toIntExact(member.getOffset()));
124124
hdfVariableLength.writeValueToByteBuffer(buffer);
125125
} else if (memberType instanceof FixedPointDatatype membertyped) {
126126
byte[] bytes = toFixedPointBytes(value, membertyped, fieldType);
127127
HdfFixedPoint hdfFixedPoint = new HdfFixedPoint(bytes, membertyped);
128-
buffer.position(member.getOffset());
128+
buffer.position(Math.toIntExact(member.getOffset()));
129129
hdfFixedPoint.writeValueToByteBuffer(buffer);
130130
} else if (memberType instanceof FloatingPointDatatype membertyped) {
131131
byte[] bytes = toFloatPointBytes(value, membertyped, fieldType);
132132
HdfFloatPoint hdfFloatPoint = new HdfFloatPoint(bytes, membertyped);
133-
buffer.position(member.getOffset());
133+
buffer.position(Math.toIntExact(member.getOffset()));
134134
hdfFloatPoint.writeValueToByteBuffer(buffer);
135135
} else {
136136
throw new UnsupportedOperationException("Unsupported member datatype: " + memberType.getClass().getName());

0 commit comments

Comments
 (0)