Я написал еще один вопрос (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 viewer я получаю
Name Value Type Array Size
Board Name UltraMaster String,length=256 Scalar
Card number 0 32-bit integer Scalar
Когда я использую С# для экспорта HDF5 (используя библиотеки на hdf5.net), я получаю:
Name Value Type Array Size
Board Name ˜„ String, length=256 1
Card Number 0 32-bit integer 1
Обратите внимание, что размер массива теперь "1" вместо скалярного, а значение для имени платы полностью закрыто. Мой код С# отличается (очевидно :)). У меня есть:
// 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++). Поэтому,
В случае, если кому-то это понадобится в какой-то более поздний момент, соответствующий код, который работал для меня, был:
// 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 и примеры. Как только вы это сделаете, посмотрите в папку "тесты", а также в папку "example".
Ура,
Дейв