将原始二进制结构写入D中的文件?

问题描述

我正在尝试使用一个二进制文件,其中包含在某些<xsl:template match="Object[not(Slot/@name='AddedValue')]"> <xsl:copy> <xsl:apply-templates select="@*"/> <Slot name="AddedValue"> <ValueList> <Value> <xsl:value-of select="'Value to Add'"/> </Value> </ValueList> </Slot> <xsl:apply-templates/> </xsl:copy> </xsl:template> 中定义的几个二进制记录。但是,我似乎找不到如何做。在其他示例中,我成功编写了struct,但没有问题string。我只想像在structC中一样写,但是在fwrite(3)第2版中写。

这是我到目前为止尝试过的:

  • 使用D-编写人类可读/调试的表示形式
  • 使用stream.write(tr)-听起来像我需要的,但是无法编译:

错误:模板std.stdio.File.rawWrite无法从中推断功能 参数类型!()(TitleRecord),候选对象为:

/usr/lib/ldc/x86_64-linux-gnu/include/d/std/stdio.d(1132):std.stdio.File.rawWrite(T)(在T []缓冲区中)

  • 如上所述尝试stream.rawWrite(tr),但是将数据投射到各种事物上也永远不会编译。
  • 甚至试图用rawWrite回到C,但是无法获得我所需的文件描述符。

the docs并没有很大帮助(写字符串对我也有用,但不写fwrite)。我敢肯定必须有一种简单的方法来执行此操作,但是我找不到它...。其他SO问题did not help me。我struct,可能已经用D 1.0完成了,但这已不再是一种选择。

stream.writeExact(&tr,tr.sizeof)

解决方法

为此,错误表示它期望数组而不是结构。因此,一种简单的方法是简单地切片一个指针并将其提供给rawWrite:

stream.rawWrite((&tr)[0 .. 1]);

(&tr)获取地址,从而将您的结构转换为指针。然后[0 .. 1]意味着从一开始就获取其中的一部分,仅获取一个元素。

因此,您现在有了T[],rawWrite可以处理其中的一个元素。

如果使用@safe批注将被警告,将无法通过,您必须将其标记为@trusted。当然,结构中的所有引用(包括string)也将被编写为二进制指针,而不是您从C经验中肯定会得到的数据。但是,如果您证明在那里就可以了。

编辑:顺便说一句,如果您愿意,您也可以只使用fwrite,从C复制/粘贴相同的代码(除非它是foo.sizeof而不是sizeof foo)。 D File只是C的FILE*的一个小包装,您可以使用stream.getFP() http://dpldocs.info/experimental-docs/std.stdio.File.getFP.html)将原始的FILE *退回给其他函数 >

,

rawWrite需要一个数组,但是有许多解决方法。

一种是创建单个元素数组。

file.rawWrite([myStruct]);

另一种将结构转换为数组。我的名为bitleveld的库具有一个名为reinterpretAsArray的函数。这也使创建上述结构的校验和变得容易。

偶尔我会遇到使用此方法进行对齐的问题,所以要小心。可以通过更改结构的align属性来解决。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...