我正在尝试使用一个二进制文件,其中包含在某些<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
。我只想像在struct
和C
中一样写,但是在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)
答案 0 :(得分:2)
为此,错误表示它期望数组而不是结构。因此,一种简单的方法是简单地切片一个指针并将其提供给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 *退回给其他函数 >
答案 1 :(得分:1)
rawWrite
需要一个数组,但是有许多解决方法。
一种是创建单个元素数组。
file.rawWrite([myStruct]);
另一种将结构转换为数组。我的名为bitleveld的库具有一个名为reinterpretAsArray
的函数。这也使创建上述结构的校验和变得容易。
偶尔我会遇到使用此方法进行对齐的问题,所以要小心。可以通过更改结构的align
属性来解决。