Как правильно перевести процедуру Delphi в функцию c#?

222
22 мая 2017, 23:51

Имеется вот такая процедура чтения строки из бинарного файла(Delphi):

procedure TTextField.Load(f:PText);
var tempstr:widestring;
    c,q,m,t:integer;
begin
   Clear;
   BlockRead(f^,m,sizeof(m));
     for q:=1 to m do 
        begin
            BlockRead(f^,t,sizeof(t));
            SetLength(tempstr,t);
            for c:=1 to t do 
                BlockRead(f^,tempstr[c],sizeof(tempstr[c]));
            Text:=Text+#13#10+tempstr;
        end;
end;

Мне надо ее перевести на C#. Сделал вот так:

public static string TTextFieldLoad(BinaryReader br)
    {
        int c = 0, q = 1, m = 0, t = 0;
        char[] tempstr = new char[1];
        while (true)
        {
            if (br.ReadInt32() == 1)
                break;
        }
        int l = br.ReadInt32();
        tempstr = br.ReadChars(l);
        return tempstr.ToString();
    }

Но выдает мусор. Возможно, я не от туда читаю. Гляньте вообще, соответствие. А то я в Delphi не бум-бум...

Вот мой код, который сработал.

FileStream fs = new FileStream("E:\\Users\\DezmontDeXa\\Desktop\\Tge\\PlanetQuestSP1\\Prison.qm", FileMode.Open);
        BinaryReader br = new BinaryReader(fs);
        br.ReadBytes(82);//Перемещаюсь на позицию, откуда начинается текст
        int strCount = br.ReadInt32();
        string str = "";
        for (int i = 0; i < strCount; i++)
        {
            int strLen = br.ReadInt32();
            for(int c = 0; c < strLen; c++)
            {
                char ch = Encoding.Unicode.GetChars(br.ReadBytes(2))[0];
                str += ch;
            }
        }
        return str;
Answer 1

Вот перевод с Delphi на русский.

Прочитать из файла 4 байта, записать в m (это количество строк)
Нижеследующий текст повторить m раз
  Прочитать из файла 4 байта, записать в t (это количество символов в следующей строке)
  Установить у временного буфера tempstr длину t
  Нижеследующий текст повторить t раз
    Прочитать из файла 2 байта, интерпретируя их как символ в двухбайтового UNICODE, записать в буфер tempstr.
  Добавить в выходной буфер text полученную в tempstr строку и символ перевода каретки.
READ ALSO
Десериализация строки

Десериализация строки

Здравствуйте! Подскажите как десериализовать строку типа

443
Один класс для двух форм

Один класс для двух форм

Можно ли сделать так чтобы Form1 и From2 ссылались на один класс? Изначально была только Form1, после добавилась From2 с почти теми же функциями что...

233
EF и превышение длины строки

EF и превышение длины строки

Я создал модель данных DataBase-First, при этом в базе данных есть поля на подобии varchar(150)В классе же такие поля выглядят как просто string

300
C#, OpenXML, формула IF

C#, OpenXML, формула IF

Для создания файла Excel использую OpenXMLВ файле Excel нужна формула IF(

298