【问题标题】:Dlang string to char * conversionDlang 字符串到 char * 的转换
【发布时间】:2016-12-15 09:36:39
【问题描述】:

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

我的问题是,在 c 中我通过转换为 (char *) 将文件读入 struct arr[]

read(filehandle, (char *)arrayOfStructs, sizeof(arrayOfStructs)

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

auto buffer = FileHandle.rawRead(arrayOfStructs)

缓冲区在哪里获取到 sizeof arrayOfStructs 的数据。

但是,我的问题来了,缓冲区似乎获取了原始数据,包括空终止,但都位于接收数组的 [0] 中,而且,我不明白/不知道它是什么数据类型(CELL[] 或字符串[] 或.....

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, 如果我在终端做一只猫,我会得到 ​​p>

anders$ cat cellspec
TESTfeedOx
atestTailingNx
aOF2 cycl primO?

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

【问题讨论】:

标签: c d


【解决方案1】:

您可能需要调用 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]。如果你想用它做一些操作,你真的很想把它转换成一个字符串。

【讨论】:

  • 嗯,我不明白你的例子。
  • 您的标题是“Dlang 字符串到 char* 的转换” - toStringz() 就是答案。就这么简单。
  • 啊,好吧,对不起,我的问题在云端......但是已经尝试过,它会吐出 char [] 忽略某处的 \0 终止。当我制作 rawRead 时,它似乎以某种方式将数据提取到字符串中,尽管我必须反思数据本身也是错误的。我会考虑将您的答案标记为答案,但这不是我想要的
  • 然后更新问题,让问题更简洁,D社区会尽力帮助你! :)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 2015-03-11
    • 2014-11-22
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2013-05-13
    相关资源
    最近更新 更多