只有第一个字符被写入 HDF5 字符串属性
Only first character being written to HDF5 string attribute
刚开始学习 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 显示名称="StringAttribute"、值="a"、类型="String,length=3"、ArraySize="Scalar"。为什么 Value="abc"?
编辑:David Heffernan 的评论让我意识到我在我的 copy/paste 中很懒惰并且错过了从 Unicode 到 8 位的所需转换,用这段代码完成
byte[] data = Encoding.UTF8.GetBytes("abc");
IntPtr dataBuffer = Marshal.AllocHGlobal(data.Length);
您提供的是 UTF16 编码文本,但库需要 8 位文本。我不知道该库,但我希望它需要 UTF8 编码的文本。
使用Encoding.UTF8.GetBytes
获取UTF8编码的文本。或者,如果需要 ASCII,则 Encoding.ASCII.GetBytes
。
刚开始学习 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 显示名称="StringAttribute"、值="a"、类型="String,length=3"、ArraySize="Scalar"。为什么 Value="abc"?
编辑:David Heffernan 的评论让我意识到我在我的 copy/paste 中很懒惰并且错过了从 Unicode 到 8 位的所需转换,用这段代码完成
byte[] data = Encoding.UTF8.GetBytes("abc");
IntPtr dataBuffer = Marshal.AllocHGlobal(data.Length);
您提供的是 UTF16 编码文本,但库需要 8 位文本。我不知道该库,但我希望它需要 UTF8 编码的文本。
使用Encoding.UTF8.GetBytes
获取UTF8编码的文本。或者,如果需要 ASCII,则 Encoding.ASCII.GetBytes
。