2016-12-15 6 views
1

私はこのコードをbinファイルから読み込んでいます。 データ構造体及びヌルのアレイに保持されている私の問題は、ということであるD.Dlang文字列からchar *への変換

を使用して同じ構造arrayOfCELLsに、ファイルに write (filehandle, (char *)arrayOfCELLs, sizeof(arrayOfCELLs); とCコードで書かれた、私の目標は、データを読み取ることである 末端c。で私はrawRead

auto buffer = FileHandle.rawRead(arrayOfStructs) 
012に私を導いたこと rcorreを通じて分かった(のchar *)へのキャストを経由して、[] arrの構造体にDIで

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

をファイルを読みます

バッファはsizeof arrayOfStructsにデータを取得します。

しかし、ここではバッファがnullterminationを含むrawdataを受け取っているようですが、受信側配列の[0]にすべて配置されています。また、データ型が何であるかわかりません。または文字列[]または.....

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

は最初はヌル終端に続く名、「TEST」であり、バッファ内のデータが(その一部)であり、この

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

を受け、sect = 1、ptyp = 1。今度は2番目のCELLがこれを保持する

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

そしてそれは、私はこれがなぜ私が

anders$ cat cellspec 
TESTfeedOx 
atestTailingNx 
aOF2 cycl primO? 

質問、任意のアイデアを取得し、端末に猫と何ができるをすれば、「テスト」と2,1、 にする必要があり、すべて間違っています私はそれを正しく得るために行うのですか?

+0

あなたはどこかcellspec、またはあなたのCとDのコード – Kozzi11

+0

・ホープ、このダウンロードリンクの作品を投稿することができ、そのためcellspec https://1drv.ms/u/s!AmN2cOqroYulgpAx8xZrCQEuj6pR9A –

+0

そしてここでDコードはhttps ://1drv.ms/u/s!AmN2cOqroYulgpAynYqWHK_zAJ011g –

答えて

0

私は、コンバージョンにどのような問題があるかを見出しました。 Cのlong型とunsigned long型はDlang long型とulong型では同じサイズではありません

解決策/結論は、D-langでコーディングし、正しい型を取得するためにファイルでC型のデータを使用する場合です。 D-langタイプのサイズがCサイズと等しくない可能性があることに注意してください。 私の場合、コードはc_longとc_ulongを使って正しい読みを得るように変更されました。その後、すべてがデータをよく読んでいました。 幸せな日

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()は、バッファの型と同じ型を返します。だから、以来、あなたは...その後bufferは、あなたが最初のセルの名前をつかむためにbuffer[0].nameを言う、とそれを使用することができるはず...すでにCELLの配列である、

auto buffer = f.rawRead(cellTab); 
を持って

.nameは実際にはchar [20]です。いくつかの操作をしたい場合は、実際には文字列に変換する必要があります。

+0

うーん、あなたの例はありません。 –

+0

あなたのタイトルは "Dlangの文字列をchar *変換"と言います--toStringz()が答えです。そのような単純な。 – DejanLekic

+0

ああ、申し訳ありませんが、私の問題で雲の中にあった....しかし、それはchar []を吐き出し、どこかで\ 0終端を無視しています。私がrawReadを作成すると、データを文字列に何とか取り込むように見えますが、データそのものも間違っていると考える必要があります。私はあなたの答えを答えとしてマークすることを検討しますが、それは私が探しているものではありません –

関連する問題