我从bin文件中读取了这段代码。
数据保存在结构数组中,并以null结尾
我的目标是读取用c代码编写的数据
write (filehandle, (char *)arrayOfCELLs, sizeof(arrayOfCELLs);
到文件,使用D。进入相同的结构arrayOfCELLs。
我的问题是在c中我通过强制转换为(char *)
将文件读入struct arr []read(filehandle, (char *)arrayOfStructs, sizeof(arrayOfStructs)
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?
问题,任何想法为什么会这样,我该怎么做才能做到正确?
答案 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来获得正确的读数。之后,所有人都很好地阅读数据。 快乐的日子