powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переписываю древний код на C#.
22 сообщений из 47, страница 2 из 2
Переписываю древний код на C#.
    #39503816
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе забывай также что разрядность char может быть больше чем byte.

C++
Макрос getc() возвращает следующий за текущей позицией символ во входном потоке stream и дает приращение указателю положения в файле. Символ считывается как unsigned char, преобра­зованный к переменной целого типа.

При достижении конца файла getc() возвращает EOF. Однако поскольку EOF имеет значение целого типа, при работе с двоичными файлами для контроля достижения конца файла необхо­димо использовать feof(). Если getc() обнаруживает ошибку, то также возвращается EOF. Следует помнить, что при работе с двоичными файлами для проверки ошибок в файле следует использо­вать ferror().

C#
ReadByte(): считывает один байт и перемещает указатель на один байт

ReadChar(): считывает значение char, то есть один символ, и перемещает указатель на столько байтов, сколько занимает символ в текущей кодировке

Я использую у себя ReadByte(), мне скорее всего нужно использовать ReadChar()?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503824
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokЯ использую у себя ReadByte(), мне скорее всего нужно использовать ReadChar()?
Нет. ReadByte() и перекодировка Encoding из 1251 или 866, смотря какая кодировка в твоем файле используется.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503826
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До того как мы кинемся портировать - нам надо ответить на вопрос - нужна ли нам бинарная совместимость со старыми файлами?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503831
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДо того как мы кинемся портировать - нам надо ответить на вопрос - нужна ли нам бинарная совместимость со старыми файлами?

Скорее всего да, но пока реализую только чтение файла.
Запись возможно и не пригодиться.
Сейчас там кодировка ANSI стоит.
Как его корректно отображать на экране?
Пока я вижу, что значения с тестовой С++ программой пока не совпадают.

И все таки не ответили на вопрос как быть с public char[] shu;
Делать как тут написано?

Спасибо!
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503840
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok[qwuot mayton]До того как мы кинемся портировать - нам надо ответить на вопрос - нужна ли нам бинарная совместимость со старыми файлами?

Скорее всего да, но пока реализую только чтение файла.
Запись возможно и не пригодиться.
Сейчас там кодировка ANSI стоит.
Как его корректно отображать на экране?
Пока я вижу, что значения с тестовой С++ программой пока не совпадают.

И все таки не ответили на вопрос как быть с public char[] shu;
Делать как тут написано?

Спасибо![/quot]
О каком экране ты говоришь?

Мне кажется ты смешал в кучу два понятия. Чтение и разбор файла - это одна логика. Там могут быть свои преференции. Свои кодировки.

Публикация текста в окне cmd/powershell это другая задача никак с первой не связаная
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503857
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonvadipok[qwuot mayton]До того как мы кинемся портировать - нам надо ответить на вопрос - нужна ли нам бинарная совместимость со старыми файлами?

Скорее всего да, но пока реализую только чтение файла.
Запись возможно и не пригодиться.
Сейчас там кодировка ANSI стоит.
Как его корректно отображать на экране?
Пока я вижу, что значения с тестовой С++ программой пока не совпадают.

И все таки не ответили на вопрос как быть с public char[] shu;
Делать как тут написано?

Спасибо!
О каком экране ты говоришь?

Мне кажется ты смешал в кучу два понятия. Чтение и разбор файла - это одна логика. Там могут быть свои преференции. Свои кодировки.

Публикация текста в окне cmd/powershell это другая задача никак с первой не связаная[/quot]

C#
Код: c#
1.
2.
3.
4.
5.
6.
7.
            byte[] bytePasat = ica010((long) 0, (long)Marshal.SizeOf(pasat));
            Pasat0 pasatTest = ByteArrayToStructure<Pasat0>(bytePasat);
            ByteArrayToNewPasat0(bytePasat);
            Console.WriteLine(pasat.kcp);
            Console.WriteLine(pasat.plp);
            Console.WriteLine(pasatTest.kcp);
            Console.WriteLine(pasatTest.plp);



C++
Код: plaintext
1.
2.
3.
4.
	if (ica010(0, (char *)&stp, 'r', 0l, (long)sizeof(stp)) == 0) { return; }

	ic = stp.kcp;  // кол. сква.
	ip = stp.plp;  // кол. пласт.



Отличаются результаты.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503868
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokОтличаются результаты.
Ожидаемо. Это 20715355 прочитал?

У тебя код написан исходя из бинарной совместимости структуры в С и C#, но они разные.
Чтобы были одинаковы надо использовать типы одинакового размера, т.е. char заменить на byte. А потом уже конвертировать в char при выводе.

Хотя и это возможно не поможет, т.к. массивы в C# это ссылочный тип, т.е. внутри структуры может оказаться только ссылка на содержимое массива. Это мое предположение, не разбирался в этих деталях.

ИМХО лучше эту тему в форуме по C# поднять.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503879
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok> И все таки не ответили на вопрос как быть с public char[] shu;

Телепатов нет. Откуда ты его взял ?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503887
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglvadipok> И все таки не ответили на вопрос как быть с public char[] shu;

Телепатов нет. Откуда ты его взял ?

Добавил, он был в С++ программе в struct.
struct очень длинный, поэтому только частично его привел в первом сообщении.
Посмотрите, там есть похожие объявления.
Переписал на C# и начались ошибки, попробовал закоментарить именно до этого объявления и заработала.
Таким образом локализовал ошибку.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503893
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokSiemarglvadipok> И все таки не ответили на вопрос как быть с public char[] shu;

Телепатов нет. Откуда ты его взял ?

Добавил, он был в С++ программе в struct.
struct очень длинный, поэтому только частично его привел в первом сообщении.
Посмотрите, там есть похожие объявления.
Переписал на C# и начались ошибки, попробовал закоментарить именно до этого объявления и заработала.
Таким образом локализовал ошибку.
Ты вообще структурировано думать в состоянии??? Ну чтобы хотя бы вопрос смочь задать.

На тебе бубен, сам и пляши.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503917
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokон был в С++ программе в struct.

Забудь об этой С++ программе, пиши с нуля программу, которая читает файлы определённой
структуры. Она не должна (и не может) быть похожа на ту, которая их записывает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504109
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovvadipokон был в С++ программе в struct.

Забудь об этой С++ программе, пиши с нуля программу, которая читает файлы определённой
структуры. Она не должна (и не может) быть похожа на ту, которая их записывает.

+1
Проще всего читать файл в массивы byte[] и поэлементно конвертировать в нужную структуру
для числовых типов BitConverter для char[] - Encoding.GetString()

Правда букав много будет, если элементов много.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504171
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TDimitry Sibiryakovпропущено...

Забудь об этой С++ программе, пиши с нуля программу, которая читает файлы определённой
структуры. Она не должна (и не может) быть похожа на ту, которая их записывает.

+1
Проще всего читать файл в массивы byte[] и поэлементно конвертировать в нужную структуру
для числовых типов BitConverter для char[] - Encoding.GetString()

Правда букав много будет, если элементов много.

Сегодня шеф объяснил как все работает на С++.
В файле данные хранятся в виде байтов.
Он просто в выделенную память их считывает и получает корректные данные.

Но ведь BitConverter берет массив байтов, а у меня только одна переменная байт.
Как это будет работать?
Код: c#
1.
2.
3.
4.
5.
                fileStream.Seek(66, SeekOrigin.Begin);
                bytePasat[0] = (byte)fileStream.ReadByte();

                uint kol_pl = BitConverter.ToUInt32(bytePasat, 0);
                int kol_pl2 = bytePasat[0];


Вот так оба переменных имеют одинаковые значения 66.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504178
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokСегодня шеф объяснил как все работает на С++.
В файле данные хранятся в виде байтов.
Он просто в выделенную память их считывает и получает корректные данные.
Если б ты еще это понял, то вопроса ниже не было бы.
vadipokНо ведь BitConverter берет массив байтов, а у меня только одна переменная байт.
Как это будет работать?
Код: c#
1.
2.
3.
4.
5.
                fileStream.Seek(66, SeekOrigin.Begin);
                bytePasat[0] = (byte)fileStream.ReadByte();

                uint kol_pl = BitConverter.ToUInt32(bytePasat, 0);
                int kol_pl2 = bytePasat[0];


Вот так оба переменных имеют одинаковые значения 66.
для одного байта не надо ничего конвертировать
Код: c#
1.
2.
                fileStream.Seek(66, SeekOrigin.Begin);
                uint kol_pl = fileStream.ReadByte();



Конвертировать надо когда несколько байт представляют одно значение, например int это 4 байта.

PS fileStream может сразу массив прочитать, а дальше выколупывай из массива, т.е. примерно так
Код: c#
1.
2.
3.
var data = new byte[fileStream.Lenght];
fileStream.Read(data, 0, data.Lenght);
uint kol_pl = BitConverter.ToUInt32(bytePasat, 66);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504180
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не дописал малость
Код: c#
1.
2.
3.
var data = new byte[fileStream.Lenght];
fileStream.Read(data, 0, data.Lenght);
uint kol_pl = BitConverter.ToUInt32(data, 66);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504182
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например это
Код: plaintext
1.
2.
3.
4.
long  j,lf,li,lx;
char  *nam,*cl,c;
cl=(char *) &lf;
	for (j = 0; j<4; j++)	*(cl + j) = getc(VECTOR);


не что иное как прочитать 4 байта и сохранить в переменную lf
В С/С++ можно в int побайтно читать с помощью трюка с приведением к указателю char *

в C# это будет так выглядеть
Код: c#
1.
2.
3.
var data = new byte[4];
fileStream.Read(data, 0, 4);
uint lf = BitConverter.ToUInt32(data);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504184
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе дописал малость
Код: c#
1.
2.
3.
var data = new byte[fileStream.Lenght];
fileStream.Read(data, 0, data.Lenght);
uint kol_pl = BitConverter.ToUInt32(data, 66);



Сейчас в документации нашел, что количество которое я пытаюсь вытащить, это:
1.0.21 Количество short 66-67
Находиться на 66-й позиции при чтении с помощью команды getc.
Но там перед ним еще куча переменных и float, long.
Мне получается нужно со читать количество байтов для каждой переменной а потом это все сложить, и эта цифра будет искомой цифрой, которая стоит 66-й при чтении с помощью команды getc?
Ну я попал!!!
В начале говорили, что там все просто, ты быстро все сделаешь. )))))))))))))))))))))))
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504194
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokDima TНе дописал малость
Код: c#
1.
2.
3.
var data = new byte[fileStream.Lenght];
fileStream.Read(data, 0, data.Lenght);
uint kol_pl = BitConverter.ToUInt32(data, 66);



Сейчас в документации нашел, что количество которое я пытаюсь вытащить, это:
1.0.21 Количество short 66-67
Находиться на 66-й позиции при чтении с помощью команды getc.
Но там перед ним еще куча переменных и float, long.
Мне получается нужно со читать количество байтов для каждой переменной а потом это все сложить, и эта цифра будет искомой цифрой, которая стоит 66-й при чтении с помощью команды getc?
Ну я попал!!!
В начале говорили, что там все просто, ты быстро все сделаешь. )))))))))))))))))))))))
А зачем тебе считать если в документации уже написано short 66-67 ? Документацию перепроверять собрался?

Ты на мои 3 строчки кода глянь, которые процитировал. Там цифра 66 даже есть. Если там тип short, т.е. 2 байта, то
Код: plaintext
1.
short kol_pl = BitConverter.ToUInt16(data, 66);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504283
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok, рано ты взялся за эту задачу.

Тебе нужна сноровка. И понимание того как можно работать с байтами и символами
и целыми числами и стоками в файлах.

Похоже сейчас у тебя такого понимания нет. Задачу ты хотя и сделаешь - то не поймешь.
Или даже не поймешь и не сделаешь. И вобщем-то я-бы тебе предложил ее на месяцок
отставить. И возьми и поразбирайся с файловыми операциями и типами данных
в отдельных топиках. Что такое byte, char, short, int, long, WORD, DWORD, QWORD,
signed/unsigned, кодировки, big-last endian,
что такое struct/union/bitfields в С++. Какие разрядности бывают. Как работают
fopen,fseek,fread,fwrite,fclose и такое же зеркальное семейство функций в C#.
Как работают битовые операции <<, >>, |, &, (xor), как выделить в целом числе
бит как установить как сбросить как влияет знаковый бит, что такое float/double/extended,
и BCD арифметика.

Создавай отдельный топик и погнали. А мы по мере возможности будем каментить и помогать.

Вобщем как-то так.

Что скажете, коллеги?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504287
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧто скажете, коллеги?
Пусть делает сейчас. ИМХО за месяц бездействия умнее не станет, а если сделает с подсказками то может через месяц/год поймет как и почему сделал.

PS Чистую теорию далеко не каждый осилит, через практику пройти гораздо легче, а итого примерно одинаково.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504293
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok....В начале говорили, что там все просто, ты быстро все сделаешь. )))))))))))))))))))))))
я говорил, что там работы на 10-15 минут.

ошибся кстати, на полчаса.

Просто нужна квалификация.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504352
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonvadipok, рано ты взялся за эту задачу.

Тебе нужна сноровка. И понимание того как можно работать с байтами и символами
и целыми числами и стоками в файлах.

Похоже сейчас у тебя такого понимания нет. Задачу ты хотя и сделаешь - то не поймешь.
Или даже не поймешь и не сделаешь. И вобщем-то я-бы тебе предложил ее на месяцок
отставить. И возьми и поразбирайся с файловыми операциями и типами данных
в отдельных топиках. Что такое byte, char, short, int, long, WORD, DWORD, QWORD,
signed/unsigned, кодировки, big-last endian,
что такое struct/union/bitfields в С++. Какие разрядности бывают. Как работают
fopen,fseek,fread,fwrite,fclose и такое же зеркальное семейство функций в C#.
Как работают битовые операции <<, >>, |, &, (xor), как выделить в целом числе
бит как установить как сбросить как влияет знаковый бит, что такое float/double/extended,
и BCD арифметика.

Создавай отдельный топик и погнали. А мы по мере возможности будем каментить и помогать.

Вобщем как-то так.


Что скажете, коллеги?


Понял, спасибо большое.
Если будут вопросы, то буду спрашивать. А куда я еще пойду.
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переписываю древний код на C#.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]