刚刚开始学习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);
答案 0 :(得分:0)
您提供的是UTF16编码文本,但该库需要8位文本。我不知道库,但我希望它需要UTF8编码的文本。
使用Encoding.UTF8.GetBytes
获取UTF8编码的文本。或者如果需要ASCII,那么Encoding.ASCII.GetBytes
。