Dlang 字符串到 char * 的转换

Dlang string to char * conversion

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

进入相同的结构 arrayOfCELLs

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

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

在D中我通过rcorre that led me to rawRead

找到了
auto buffer = FileHandle.rawRead(arrayOfStructs)

缓冲区获取数据到 arrayOfStructs 大小的位置。

但是,我的问题来了,缓冲区似乎得到了原始数据,包括 nulltermination,但都位于接收数组的 [0] 中,而且,我不 understand/know 它是什么数据类型( CELL[] 或 string[] 或 .....

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

缓冲区中接收到的数据是(部分)这个

[CELL("TEST[=13=]feed[=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=][=13=]", 1, 1,

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

CELL("\x01[=14=][=14=][=14=]\x02[=14=][=14=][=14=]N[=14=][=14=][=14=]\x04[=14=][=14=][=14=]\x02[=14=][=14=][=14=]", 65656, 655375,

那都是错的,应该是"test"和2,1, 如果我在终端做一只猫,我会得到

anders$ cat cellspec
TESTfeedOx
atestTailingNx
aOF2 cycl primO?

问题,为什么会这样,我该怎么做才能正确处理?

您可能需要调用 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() returns 与缓冲区的类型相同。所以,既然你有

auto buffer = f.rawRead(cellTab);

,那么 buffer 已经是一个 CELL 的数组...您应该可以将它与 buffer[0].name 一起使用来获取第一个单元格的名称...

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

我发现了转换的问题所在。 C中的long和unsigned long在Dlang long和ulong中大小不一样

Solution/conclusion 是在 D-lang 中编码并在文件中使用 C 类型数据时,为了获得正确的读取,需要注意 D-lang 类型大小可能不等于 C 大小。 在我的例子中,代码更改为使用 c_long 和 c_ulong 来获得正确的读数。之后一切都很好地读取数据。 快乐的日子