Thanks Gerd for the comments and code. I went through your code and I am no more enlightened as to what may be going wrong with my code. You are correct that I am using fixed length string of 10 characters including the terminating null. As a side note there does not seem to be a way of setting the character encoding, i.e. set_cset(...)? For practical purposes and in most situations its not going to matter I guess whether its ASCII or UTF-8. To your comment on initialization, I believe the following statement is ok:tsa[i].char1 = barr2;I have confirmed this in the debugger. I have even looked at the contents of each of the tsa[i].char arrays and mapped to the ASCII table and all is in order. Lonnie > ---------------------------------------------------------------------- > > Message: 1 > Date: Mon, 8 Jun 2015 12:37:42 +0100 > From: Lonnie Hamm <[email protected]> > To: "[email protected]" <[email protected]> > Subject: [Hdf-forum] HDF5DotNet and string in compound data type > Message-ID: <[email protected]> > Content-Type: text/plain; charset="iso-8859-1" > > I know this question (or related to) has been asked a few times but the > answers don't seem to be of any help to me. Below is my code. I am simply > trying to write out a compound data type with one element being a string. > All the numbers, i.e. int1, double1, and double2 in the structure are correct > when I view the resulting file in HDFView but the string is garbage. Any > suggestions? > > > using System; > using HDF5DotNet; > using System.Runtime.InteropServices; > using System.IO; > > namespace TestCompound > { > class Program > { > const int N_RECORDS = 5; // number of records in the table > const int N_FIELDS = 4; // number of fields > const int RANK = 1; > const string TABLE_NAME = "Test"; > const string FILE_NAME = "test_file2.h5"; > > [StructLayout(LayoutKind.Explicit)] > public struct testStruct2 > { > [FieldOffset(0)] > public int int1; > [FieldOffset(4)] > public byte[] char1; // assuming 9 characters + null termination > [FieldOffset(14)] > public double double1; > [FieldOffset(22)] > public double double2; > } > > static void Main(string[] args) > { > try > { > > // initialize the data > testStruct2[] tsa = new testStruct2[N_RECORDS]; > for (int i = 0; i< N_RECORDS; i++) > { > tsa[i].int1 = i; > byte[] barr1 = > System.Text.Encoding.ASCII.GetBytes("testline" + i.ToString()); > byte[] barr2 = new byte[10]; > System.Buffer.BlockCopy(barr1, 0, barr2, 0, 9); > barr2[9] = 0; // null termination > tsa[i].char1 = barr2; > tsa[i].double1 = i * (i + 0.25); > tsa[i].double2 = 1 / (i + 1.25); > } > > // create the file > H5FileId fileId = H5F.create(FILE_NAME, > H5F.CreateMode.ACC_TRUNC); > > // create the data space > long[] dims = new long[1] { N_RECORDS }; > H5DataSpaceId spaceId = H5S.create_simple(RANK, dims); > > // create the memory data type > int structSize = Marshal.SizeOf(typeof(testStruct2)); > H5DataTypeId typeId = H5T.create(H5T.CreateClass.COMPOUND, > structSize); > > // insert members > string[] field_names = { "a", "b", "c", "d" }; > H5T.insert(typeId, field_names[0], > Marshal.OffsetOf(typeof(testStruct2), "int1").ToInt32(), > H5T.H5Type.NATIVE_INT); > H5DataTypeId stDtId = H5T.copy(H5T.H5Type.C_S1); > H5T.setSize(stDtId, 10); > H5T.insert(typeId, field_names[1], > Marshal.OffsetOf(typeof(testStruct2), "char1").ToInt32(), stDtId); > H5T.insert(typeId, field_names[2], > Marshal.OffsetOf(typeof(testStruct2), "double1").ToInt32(), > H5T.H5Type.NATIVE_DOUBLE); > H5T.insert(typeId, field_names[3], > Marshal.OffsetOf(typeof(testStruct2), "double2").ToInt32(), > H5T.H5Type.NATIVE_DOUBLE); > > // create the dataset > H5DataSetId dsetId = H5D.create(fileId, TABLE_NAME, typeId, > spaceId); > > // Write the dataset. > H5D.write<testStruct2>(dsetId, typeId, spaceId, spaceId, new > H5PropertyListId(H5P.Template.DEFAULT), new H5Array<testStruct2>(tsa)); > // Close resources. > H5D.close(dsetId); > H5S.close(spaceId); > H5T.close(typeId); > H5F.close(fileId); > } > catch (HDFException anyHDF5E) > { > Console.WriteLine(anyHDF5E.Message); > } > catch (System.Exception sysE) > { > Console.WriteLine(sysE.TargetSite); > Console.WriteLine(sysE.Message); > } > } > } > } > > Lonnie > > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: > <http://lists.hdfgroup.org/pipermail/hdf-forum_lists.hdfgroup.org/attachments/20150608/82edf667/attachment-0001.html> > > ------------------------------ > > Message: 2 > Date: Mon, 8 Jun 2015 13:18:58 +0000 > From: Gerd Heber <[email protected]> > To: HDF Users Discussion List <[email protected]> > Subject: Re: [Hdf-forum] HDF5DotNet and string in compound data type > Message-ID: > > <blupr0701mb197145ae0b1b8a9e35250a6da4...@blupr0701mb1971.namprd07.prod.outlook.com> > > Content-Type: text/plain; charset="us-ascii" > > Lonnie, how are you? I'm sure you are aware of the difference between > fixed-length and variable-length strings, and how the (C-) library deals with > them. > Attached is an IronPython example similar to yours, but with a > variable-length string > member. I believe your example is intended to use a fixed-length (10) member. > The problem might be your assignment > > tsa[i].char1 = barr2; > > which doesn't really initialize the 10 bytes you set aside for the string in > tsa[i]. > > G. > > From: Hdf-forum [mailto:[email protected]] On Behalf Of > Lonnie Hamm > Sent: Monday, June 8, 2015 6:38 AM > To: [email protected] > Subject: [Hdf-forum] HDF5DotNet and string in compound data type > > I know this question (or related to) has been asked a few times but the > answers don't seem to be of any help to me. Below is my code. I am simply > trying to write out a compound data type with one element being a string. > All the numbers, i.e. int1, double1, and double2 in the structure are correct > when I view the resulting file in HDFView but the string is garbage. Any > suggestions? > > > using System; > using HDF5DotNet; > using System.Runtime.InteropServices; > using System.IO; > > namespace TestCompound > { > class Program > { > const int N_RECORDS = 5; // number of records in the table > const int N_FIELDS = 4; // number of fields > const int RANK = 1; > const string TABLE_NAME = "Test"; > const string FILE_NAME = "test_file2.h5"; > > [StructLayout(LayoutKind.Explicit)] > public struct testStruct2 > { > [FieldOffset(0)] > public int int1; > [FieldOffset(4)] > public byte[] char1; // assuming 9 characters + null termination > [FieldOffset(14)] > public double double1; > [FieldOffset(22)] > public double double2; > } > > static void Main(string[] args) > { > try > { > > // initialize the data > testStruct2[] tsa = new testStruct2[N_RECORDS]; > for (int i = 0; i< N_RECORDS; i++) > { > tsa[i].int1 = i; > byte[] barr1 = > System.Text.Encoding.ASCII.GetBytes("testline" + i.ToString()); > byte[] barr2 = new byte[10]; > System.Buffer.BlockCopy(barr1, 0, barr2, 0, 9); > barr2[9] = 0; // null termination > tsa[i].char1 = barr2; > tsa[i].double1 = i * (i + 0.25); > tsa[i].double2 = 1 / (i + 1.25); > } > > // create the file > H5FileId fileId = H5F.create(FILE_NAME, > H5F.CreateMode.ACC_TRUNC); > > // create the data space > long[] dims = new long[1] { N_RECORDS }; > H5DataSpaceId spaceId = H5S.create_simple(RANK, dims); > > // create the memory data type > int structSize = Marshal.SizeOf(typeof(testStruct2)); > H5DataTypeId typeId = H5T.create(H5T.CreateClass.COMPOUND, > structSize); > > // insert members > string[] field_names = { "a", "b", "c", "d" }; > H5T.insert(typeId, field_names[0], > Marshal.OffsetOf(typeof(testStruct2), "int1").ToInt32(), > H5T.H5Type.NATIVE_INT); > H5DataTypeId stDtId = H5T.copy(H5T.H5Type.C_S1); > H5T.setSize(stDtId, 10); > H5T.insert(typeId, field_names[1], > Marshal.OffsetOf(typeof(testStruct2), "char1").ToInt32(), stDtId); > H5T.insert(typeId, field_names[2], > Marshal.OffsetOf(typeof(testStruct2), "double1").ToInt32(), > H5T.H5Type.NATIVE_DOUBLE); > H5T.insert(typeId, field_names[3], > Marshal.OffsetOf(typeof(testStruct2), "double2").ToInt32(), > H5T.H5Type.NATIVE_DOUBLE); > > // create the dataset > H5DataSetId dsetId = H5D.create(fileId, TABLE_NAME, typeId, > spaceId); > > // Write the dataset. > H5D.write<testStruct2>(dsetId, typeId, spaceId, spaceId, new > H5PropertyListId(H5P.Template.DEFAULT), new H5Array<testStruct2>(tsa)); > // Close resources. > H5D.close(dsetId); > H5S.close(spaceId); > H5T.close(typeId); > H5F.close(fileId); > } > catch (HDFException anyHDF5E) > { > Console.WriteLine(anyHDF5E.Message); > } > catch (System.Exception sysE) > { > Console.WriteLine(sysE.TargetSite); > Console.WriteLine(sysE.Message); > } > } > } > } > > Lonnie > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: > <http://lists.hdfgroup.org/pipermail/hdf-forum_lists.hdfgroup.org/attachments/20150608/a863b46a/attachment.html> > -------------- next part -------------- > A non-text attachment was scrubbed... > Name: h5_cmpd.py > Type: application/octet-stream > Size: 5525 bytes > Desc: h5_cmpd.py > URL: > <http://lists.hdfgroup.org/pipermail/hdf-forum_lists.hdfgroup.org/attachments/20150608/a863b46a/attachment.obj> > > ------------------------------ > > Subject: Digest Footer > > _______________________________________________ > Hdf-forum is for HDF software users discussion. > [email protected] > http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org > > > ------------------------------ > > End of Hdf-forum Digest, Vol 72, Issue 19 > *****************************************
_______________________________________________ Hdf-forum is for HDF software users discussion. [email protected] http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org Twitter: https://twitter.com/hdf5
