只有第一个字符被写入HDF5字符串属性

时间:2018-03-10 17:44:13

标签: c# pinvoke hdf5

刚刚开始学习HDF5并在我试图模拟的现有HDF5文件中找到了一个字符串属性。当我执行这个C#代码(使用HDF5 PInvoke ver 1.10.1)时:

long typeId = H5T.copy(H5T.C_S1);
H5T.set_cset(typeId, H5T.cset_t.UTF8);
H5T.set_size(typeId, new IntPtr(3));
long spaceId = H5S.create(H5S.class_t.SCALAR);
long attributeId = H5A.create(dataSetId, "StringAttribute", typeId, spaceId);
char[] data = "abc".ToCharArray();
IntPtr dataBuffer = Marshal.AllocHGlobal(data.Length * sizeof(char));
Marshal.Copy(data, 0, dataBuffer, data.Length);
H5A.write(attributeId, typeId, dataBuffer);

HDFView 3.0显示Name =“StringAttribute”,Value =“a”,Type =“String,length = 3”,ArraySize =“Scalar”。为什么不值=“abc”?

编辑:David Heffernan的评论让我意识到我在复制/粘贴时很懒,错过了从Unicode到8位的所需转换,使用此代码完成

byte[] data = Encoding.UTF8.GetBytes("abc");
IntPtr dataBuffer = Marshal.AllocHGlobal(data.Length);

1 个答案:

答案 0 :(得分:0)

您提供的是UTF16编码文本,但该库需要8位文本。我不知道库,但我希望它需要UTF8编码的文本。

使用Encoding.UTF8.GetBytes获取UTF8编码的文本。或者如果需要ASCII,那么Encoding.ASCII.GetBytes