Большой Воронежский Форум
» Программирование>Делфи, TOClient
][irurg 10:01 19.08.2013
добрый день
Возникла проблема с Делфи. Нужно переписать код на делфи под С#, мне прислали делфевый проект.
При открытии пишет груду ошибок про класс TOClient (вложение), соовтественно не стартует, не могу отдебажить. Предполагаю что то нужно подключить, но что и где взять?
win 7 64х, делфи 7 ent/
Прошу откликнуться.
Изображения
[Ответ]
DWanek 10:34 19.08.2013
К проекту подключены сторонние модули: UOMemTable, UOClient, UOrionAbstracts, UOrionTCPConnection. Учитывая то, что гугл о ни не знает, это, скорее всего, какие-то самописные библиотеки для работы с базами данных тех, кто дал вам этот проект. Этих файлов в самом проекте нет? Может они приложены и их просто нужно подключить? [Ответ]
Hopkroft 11:00 19.08.2013
][irurg, откуда ты этот проект взял?
В некоторых случаях, проще написать с 0 на C#. Имея только рабочее приложение, и сам код. Он у тебя есть. Так что принцип работы ты знаешь.

P.S.
Наблюдал ситуацию, когда одна организация спионерила исходники, без компонентов. Пытались запустить но тщетно. Оказалось часть компонентов, было "обёрткой" для достаточно специфичных компонент. Пришлось выходить на программиста, который рассказал что и как.

Ах да, чуть не забыл... DWanek , +1 [Ответ]
silly 11:12 19.08.2013

Сообщение от Hopkroft:
Наблюдал ситуацию, когда одна организация спионерила исходники, без компонентов. Пытались запустить но тщетно. Оказалось часть компонентов, было "обёрткой" для достаточно специфичных компонент. Пришлось выходить на программиста, который рассказал что и как.

Это, кстати, говорит не в пользу того программиста. Ну, знаете, bus factor и все такое. [Ответ]
Hopkroft 11:22 19.08.2013
silly, ) Bus Factor тут не причём. Я допустим при разработке программ, библиотеки или компоненты храню в отдельной папке. Т.к. иногда приходиться их обновлять или с новой версией экспериментировать.
Ещё один аргумент, вот у меня например, несколько проектов используют компонент FastReport. Я же не буду эти компоненты в каждую папку проекта совать.
Так что если скопировать папку Source, то исходники просто не откомпилируются, т.к. IDE не найдёт библиотек.
[Ответ]
][irurg 12:41 19.08.2013
да, погуглил поглубже - видимо какие то самописные функции. В файле проекта библиотек нет.
Может сможете тогда в конвертации помочь?
Проблема в том, что в проге происходит раскодирование последовательности из базы данных скл. Последовательность выглядит примерно так -
OќnюRюT
набор сиволов. В скл выглядит чуть иначе чем тут. Всего 11 символов.
из этой строки должен получаться шестнадцатиричный код :
540052006E9D4F01

Переписываю алгоритм в си шарп, получаю хрень:
54144e52144e6e45c4f

Алгоритм перед раскодировкой обрабатывает исх строку и выкидывает эскейп-символы. Вот тут видимо и засада.
Вот алгоритм на делфи:

Сообщение от :
function DecodeEscapePos(str:shortstring):shortstring;
var i:integer;
len:integer;
begin
result:='';
len:=length(str);
i:=0;
while i<len do begin
inc(i);
if (str[i]=#254) then
begin
if str[i+1]=#1 then
begin
result := result + #0;
inc(i);
end else
if str[i+1]=#2 then
begin
result := result + #254;
inc(i);
end else
if str[i+1]=#3 then
begin
result := result + ' ';
inc(i);
end else
if str[i+1]=#4 then
begin
result := result + '\';
inc(i);
end else
if str[i+1]=#5 then
begin
result := result + #10;
inc(i);
end;

end
else
begin
result:=result+str[i];
end;
end;{while}
end;

С прогой на делфи приложили экзешник, вот он работает нормально. Вижу что вид исходной строки такой же как я читаю на си, те же символы. Однако видимо коды у них разные - из алгоритма видно, что 0х254 является основным эскейп символом, а у меня его в си вобще нет.
Прикладываю скриншот из си.
И ладно бы проблемы кодировки какие нибудь - другие то символы угадываются -
540052006E9D4F01 - что должно быть
54144e52144e6e45c4f - что получаю

54, 52, 6е - присутсвуют. 144e видимо должно в 00 превратится. 9D4F - код карточки который мне нужен, он там вобще не угадывается в том что получаю.
Изображения
Нажмите на изображение для увеличения
Название: си ошибка.jpg
Просмотров: 14
Размер:	42.5 Кб
ID:	2291482  
[Ответ]
Hopkroft 12:47 19.08.2013
][irurg, 0х254 != #254
#254 значит в десятичном коде!
Сам посуди, откуда взяться такому символу? Таблица ASCII это вроде как 256 символов, а если ты переведёшь 254 из Шестрадцатеричной в десятеричную, то за её границы выйдешь.

В дельфи свои фишки с кодировкой. там например #13#10 равно '\n' из C/C++.
И вообще сделай через switch Так удобнее анализировать будет. [Ответ]
][irurg 13:04 19.08.2013
Hopkroft, блин, я думал # в делфях символ шестнадцатиричных чисел. Причем где то даже натыкался в инете на такую статью. Сейчас еще раз посмотрел -
" В этом случае перед целым десятичным числом без знака, находящимся в интервале от 0 по 255, ставится специальный знак # . Например, #65 (литера A) | #40 (литера открывающаяся круглая скобка) | #36 (литера $)."

Но все равно непонятно, у меня в строке десятичных 254 тоже нет.

Сообщение от Hopkroft:
Сам посуди, откуда взяться такому символу? Таблица ASCII это вроде как 256 символов, а если ты переведёшь 254 из Шестрадцатеричной в десятеричную, то за её границы выйдешь.

дык вот это и смутило. Посмотри на скриншот из Си - там и больше 1000 коды есть. Почему, откуда? [Ответ]
Hopkroft 13:10 19.08.2013

Сообщение от ':
дык вот это и смутило. Посмотри на скриншот из Си - там и больше 1000 коды есть. Почему, откуда?

Уверен что это не Unicode? Я в C# не силён, но вот Java по умолчанию хранит в Юникоде.
По поводу 254 символа...Тут зависит от того кто тебе поток создаёт. Т.к. может какая-то функция генерирует сообщение с 254 символом в конце. Вот тогда он у тебя и появиться.
Кстати, Delphi (до включительно 2007) использовала ASCII, так что вероятность что в программе у тебя использовалось ASCII кодировка равна 100%. Тем более у тебя стоит тип ShortString.

P.S. или как вариант переменная "обрезается" до нужного типа. [Ответ]
][irurg 13:30 19.08.2013
Hopkroft, огромное сердечное спасибо! конечно это не ASCII был, cp1251.
две строчки все решили:
var encoding = Encoding.GetEncoding(1251);
var str = encoding.GetBytes(str1);

и там уже 254 символ присутствует. [Ответ]
Hopkroft 13:32 19.08.2013
][irurg, рад что помог. Удачной компиляции. [Ответ]
silly 19:29 19.08.2013

Сообщение от ':
конечно это не ASCII был, cp1251

Странные вы какие… Текст имеет кодировку, последовательности байт кодировки не имеют. [Ответ]
][irurg 07:00 20.08.2013
silly, что есть текст как не последовательность байт ) [Ответ]
Spectator 08:55 20.08.2013

Сообщение от silly:
Странные вы какие… Текст имеет кодировку, последовательности байт кодировки не имеют.

это ты странный, никак не можешь понять что текст - это и есть последовательность байт. последовательность байт можно рассматривать как текст, а текст - как последовательность байт.
автор свою проблему, как я понимаю, решил, так что мы никому не помешаем, тем паче что ему тоже сия таинственная тема сущности текста любопытна))) [Ответ]
silly 11:21 20.08.2013

Сообщение от Spectator:
это ты странный, никак не можешь понять что текст - это и есть последовательность байт. последовательность байт можно рассматривать как текст, а текст - как последовательность байт.

Spectator, ты, как обычно, неправ. Кодировка по определению есть сопоставление байтиков с буквами, если в бинарных данных не закодирован текст, то у них нет и кодировки. [Ответ]
Hopkroft 12:25 20.08.2013
silly, ты можешь рассматривать последовательность байт как закодированный текст. Применяя к нему кодировку ты будешь менять его отображение.
Например, ты же когда открывать JPEG в текстовом редакторе, в зависимости от кодировки у тебя будут меняться буковки на экране.
Компьютеру плевать, что у тебя за данные. Как ты с ними работаешь так он и будет тебе их отображать. [Ответ]
Вверх