2016-12-15 5 views
1

У меня есть этот код, читаемый из файла bin. данные хранятся в массиве структур и нулем Моя цель состоит в том, чтобы читать данные, записанные в с-кодом с write (filehandle, (char *)arrayOfCELLs, sizeof(arrayOfCELLs); в файл, в ту же структуры arrayOfCELLs с помощью D.Dlang string to char * conversion

Моя проблема заключается в том, что в с я прочитал файл в STRUCT обр [] с помощью гипсе, чтобы (символ *)

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

в DI узнал через rcorre, что привело меня к rawRead

auto buffer = FileHandle.rawRead(arrayOfStructs) 

где буфер получает данные в sizeof arrayOfStructs.

Однако здесь возникает моя проблема: кажется, что буфер получает необработанные данные, включая 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» с последующим прекращением нуль- , then 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

вы можете разместить где-нибудь ваш cellspec, или ваш C и D код – Kozzi11

+0

Hope это скачать ссылка работает, его для cellspec https://1drv.ms/u/s!AmN2cOqroYulgpAx8xZrCQEuj6pR9A –

+0

А вот d код HTTPS : //1drv.ms/u/s! AmN2cOqroYulgpAynYqWHK_zAJ011g –

ответ

0

Я выяснил, в чем проблема с конверсиями. Длинные и без знака длинны в C не имеют одинакового размера в 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() возвращает тот же тип, что и тип буфера. Таким образом, поскольку у вас есть

auto buffer = f.rawRead(cellTab); 

, то buffer уже массив CELL в ... Вы должны быть в состоянии использовать его, скажем buffer[0].name, чтобы захватить имя первой ячейки ...

Имейте в виду, что .name на самом деле char [20]. Вы действительно хотите преобразовать его в строку, если хотите выполнить некоторые операции с ней.

+0

Хммм, у меня нет вашего примера. –

+0

Ваше название гласит: «Dlang string to char * conversion» - toStringz() - ответ. Просто как тот. – DejanLekic

+0

Ahh OK, извините, был в облаках с моей проблемой ... Пробовал, однако, и он выплевывает char [], игнорируя окончание \ 0. Когда я делаю rawRead, кажется, что он каким-то образом извлекает данные в строку, хотя я должен задуматься над тем, что сами данные ошибочны. Я отвечу на ваш ответ как ответ, но это не то, что я ищу –