Dlang string to char * conversion

时间:2016-12-15 09:36:40

标签: c d

我从bin文件中读取了这段代码。 数据保存在结构数组中,并以null结尾 我的目标是读取用c代码编写的数据 write (filehandle, (char *)arrayOfCELLs, sizeof(arrayOfCELLs); 到文件,使用D。进入相同的结构arrayOfCELLs。

我的问题是在c中我通过强制转换为(char *)

将文件读入struct arr []
read(filehandle, (char *)arrayOfStructs, sizeof(arrayOfStructs)

在D中,我通过rcorre找到了rawRead

auto buffer = FileHandle.rawRead(arrayOfStructs)

缓冲区将数据传递给sizeof arrayOfStructs。

然而,这是我的问题,缓冲区似乎得到rawdata包括nulltermination但所有位于接收数组的[0],同样,我不明白/知道它是什么数据类型(CELL []或string []或.....

struct CELL{ char [20] name, int sect, int type ...};
struct CELL [50] arrayOfCELLs;
auto buffer = ..rawRead(arrayOfCELLs)

缓冲区中接收的数据是(部分)此

[CELL("TEST\0feed\0\0\0\0\0\0\0\0\0\0\0", 1, 1,

第一个是名称,“TEST”后跟空终止,然后是sect = 1,ptyp = 1。现在第二个CELL持有这个

CELL("\x01\0\0\0\x02\0\0\0N\0\0\0\x04\0\0\0\x02\0\0\0", 65656, 655375,

这都是错的,应该是“测试”和2,1, 如果我在终端做猫,我会

anders$ cat cellspec
TESTfeedOx
atestTailingNx
aOF2 cycl primO?

问题,任何想法为什么会这样,我该怎么做才能做到正确?

2 个答案:

答案 0 :(得分:0)

您可能需要调用toStringz()和fromStringz()。 (文档页面:http://dlang.org/phobos/std_string.html

示例(来自上述页面):

import core.stdc.string : strlen;
import std.conv : to;

auto p = toStringz("foo");
assert(strlen(p) == 3);
const(char)[] foo = "abbzxyzzy";
p = toStringz(foo[3..5]);
assert(strlen(p) == 2);

assert(fromStringz(null) == null);
assert(fromStringz("foo") == "foo");

此外,rawRead()返回与缓冲区类型相同的类型。所以,既然你有

auto buffer = f.rawRead(cellTab);

,然后buffer已经是一个CELL的数组......您应该可以使用它,比如buffer[0].name来获取第一个单元格的名称......

请记住.name实际上是char [20]。如果你想用它做一些操作,你真的想把它转换成字符串。

答案 1 :(得分:0)

我发现了转化的问题。 C中长而无符号的长度在Dlang long和ulong中的大小不同

解决方案/结论是在D-lang中编码并在文件中使用C类型数据时,为了使读数正确,需要注意D-lang类型大小可能不等于C大小。 在我的情况下,代码更改为使用c_long和c_ulong来获得正确的读数。之后,所有人都很好地阅读数据。 快乐的日子