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 来获得正确的读数。之后一切都很好地读取数据。
快乐的日子
我从 bin 文件中读取了这段代码。
数据保存在一个结构数组中并以 null 结尾
我的目标是读取用 c 代码编写的数据
write (filehandle, (char *)arrayOfCELLs, sizeof(arrayOfCELLs);
到一个文件,使用 D.
我的问题是,在 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 来获得正确的读数。之后一切都很好地读取数据。 快乐的日子