Необходимо убедиться, что вывод C # HDF5 (атрибутов) такой же, как в Visual C ++. Или что эквивалентно форматированию HDF5 в C # как C ++

1

Я написал еще один вопрос (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++). Поэтому,

  1. Как получить размер массива "Скаляр",
  2. Как мне вывести имя платы? Я предполагаю, что это имеет отношение к тому факту, что я имею дело с строками С# (unicode), а не C++ ascii.
Теги:
visual-c++
hdf5

1 ответ

1
Лучший ответ

В случае, если кому-то это понадобится в какой-то более поздний момент, соответствующий код, который работал для меня, был:

// 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".

Ура,

Дейв

Ещё вопросы

Сообщество Overcoder
Наверх
Меню