2016-12-15 89 views
1

我已經從bin文件中讀取此代碼。 數據以結構的數組保持和空終止 我的目標是使用D.Dlang字符串到char *轉換

我的問題是讀取數據,寫入C代碼與 write (filehandle, (char *)arrayOfCELLs, sizeof(arrayOfCELLs); 到一個文件,進入相同的結構arrayOfCELLs在C我文件讀入到一個struct ARR []通過強制轉換爲(字符*)

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

在DI發現通過rcorre,導致我rawRead

auto buffer = FileHandle.rawRead(arrayOfStructs) 

其中緩衝區將數據獲取到sizeof arrayOfStructs。

然而,這纔是我的問題,緩衝似乎對RAWDATA包括nulltermination但所有位於[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, 

這是完全錯誤的。如果我做一個貓的終端,我得到

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中的size不一樣

解決方法/結論是在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()返回類型相同緩衝液的類型。所以,既然你有

auto buffer = f.rawRead(cellTab); 

,那麼buffer已經CELL的數組...你應該能夠與使用它,說buffer[0].name搶到第一小區的名字......

請記住,.name實際上是char [20]。如果你想用它做一些操作,你真的想把它轉換成一個字符串。

+0

嗯,我沒有得到你的例子。 –

+0

你的標題說「Dlang字符串到char *轉換」 - toStringz()是答案。就那麼簡單。 – DejanLekic

+0

Ahh好吧,對不起,我的問題在雲層中....已經嘗試過,但它吐出char []忽略\ 0終止的地方。當我創建rawRead時,它似乎以某種方式將數據提取到字符串中,儘管我必須反思數據本身也是錯誤的。我會考慮將你的答案作爲答案,但這不是我要找的答案 –