需要确保(属性的)C#HDF5输出与Visual C++相同.或者在C#中什么是等价的HDF5格式作为C++

本文关键字:C++ 什么 格式 HDF5 相同 属性 确保 C#HDF5 Visual 输出 或者 | 更新日期: 2023-09-27 18:29:52

我写了另一个问题(https://stackoverflow.com/questions/26812721/hdf5-c-sharp-examples-to-solve-3-specific-questions-i-demonstrate-what-has-been)这被标记为过于笼统,所以我正在重写,以尽可能清晰、简洁和具体。我使用了Visual C++和HDF5(请参阅:www.hdfgroup.org)来输出一些数据集。一切都很好。为了格式化C++中的两个属性,我使用

DataSpace attr_dataspace = DataSpace(H5S_SCALAR);  
Attribute attribute_cardNum = dataSet.createAttribute(
    attrCardNumber, PredType::STD_I32BE, attr_dataspace, PropList::DEFAULT);
attribute_cardNum.write(PredType::NATIVE_INT, &cardNumber);  // write out the card number

StrType strdatatype(PredType::C_S1, 256); // of length 256 characters
// Create attribute and write to it
Attribute attribute_boardName = dataSet.createAttribute(
    attrBoardName, strdatatype, attr_dataspace);
attribute_boardName.write(strdatatype, asciiBoardName);

例如,使用HDF5 Java查看器,我得到

Name        Value       Type        Array Size
Board Name  UltraMaster String,length=256   Scalar
Card number     0       32-bit integer      Scalar

当我使用C#导出HDF5(使用HDF5.net上的库)时,我得到:

 Name       Value       Type        Array Size
Board Name  ˜„      String, length=256  1
Card Number 0       32-bit integer      1

请注意,Array Size现在是"1",而不是标量,Board Name的Value完全被冲洗掉了。我的C#代码不同(显然:)。我有:

// Create card Number attribute
H5AttributeId attrCardId =   H5A.create(dataSetId, "Card Number", typeId, 
   H5S.create_simple(1, new long[1] { 1 }));
H5A.write(attrCardId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), 
   new H5Array<int> (new int[]{cardNumber}));
// Create Board Name attribute
byte[] asciiStr = ASCIIEncoding.ASCII.GetBytes("Board Name");
H5AttributeId attrBoardNameId = H5A.create(dataSetId, "Board Name",
   H5T.create(H5T.CreateClass.STRING, 256), H5S.create_simple(1, new long[1] { 1 }));
H5A.write(attrBoardNameId, H5T.create(H5T.CreateClass.STRING,256), 
     new H5Array<string>(new string[] { GetBoardNameFromCardNum(cardNumber) }));

正如我所说,结果是不同的。最好让C#模拟C++输出(尽管我想我可以更改C++代码)。特别是

  1. 如何将数组大小设置为"标量"
  2. 如何输出板名称?我认为这与我处理的是C#字符串(unicode)而不是C++ascii字符串有关

需要确保(属性的)C#HDF5输出与Visual C++相同.或者在C#中什么是等价的HDF5格式作为C++

如果以后有人需要,对我有效的相关代码是:

// Card Number Attribute
 H5AttributeId attrCardId =   H5A.create(dataSetId, "Card Number", typeId, H5S.create(H5S.H5SClass.SCALAR));
        H5A.write(attrCardId, new H5DataTypeId(H5T.H5Type.NATIVE_INT), new H5Array<int> (new int[]{cardNumber}));

注意H5A.create而不是H5A.create_simple

 // Create Board Name attribute
        byte[] asciiStr = ASCIIEncoding.ASCII.GetBytes(GetBoardNameFromCardNum(cardNumber));
        H5AttributeId attrBoardNameId = H5A.create(dataSetId, "Board Name", H5T.create(H5T.CreateClass.STRING, 256), H5S.create(H5S.H5SClass.SCALAR));
        H5A.write(attrBoardNameId, H5T.create(H5T.CreateClass.STRING,256), new H5Array<byte>(asciiStr));

此外,我想指出的是,以下是一些HDF5.net示例:HDF5.net。查找•HDF5DotNet源代码和示例一旦你得到了,看看下面的"测试"文件夹以及"示例"文件夹。

干杯,

Dave