Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Аналог Chr() и Ord() из delphi в С# / 11 сообщений из 11, страница 1 из 1
28.12.2012, 20:49
    #38096655
ixilimuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
Доброго времени суток, уважаемые коллеги.

Переношу некоторый алгоритм шифрования строк из Delphi проекта, на С# .Net.

Большое затруднение вызывает момент изменения символа. По сути мне нужно получить Код символа, прибавить или отнять от него какое-то число, затем результат обратно преобразовать к символу.

В дельфи это выглядит так:
Код: pascal
1.
2.
  For I := 1 to Length(StrValue) do
    StrValue[I] := Chr(Ord(StrValue[I])+20);



Вот что то такое написал я на C# после некоторых минут-часов чтения и подбора методов:
Код: c#
1.
2.
3.
4.
5.
6.
           string bufstr = "";
            for (int i = 0; i <= Str.Length - 1; i++)
            {
                //Str[i] = (Char.GetNumericValue(Str[i])); оказалось что к ячейки строки присваивать нельзя =(
                bufstr = bufstr + Convert.ToString((char)(Convert.ToInt16(Str[i]) - 20));
            }


Str - Это параметр передающийся в функцию. Точно так же как и StrValue в первом примере кода.


В общем написанный мною код выдает что-то несуразное. Более того даже количество символов не соответствует исходному тексту. Ясное дело что я где-то накосячил. Где - не могу понять, так как первый раз столкнулся с C# лицом к лицу)

Буду очень признателен за помощь начинающему )) Спасибо))
...
Рейтинг: 0 / 0
28.12.2012, 21:13
    #38096676
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
ixilimuse,

Возможно Вам поможет

string s = "";
char[] с = s.ToCharArray();
...
Рейтинг: 0 / 0
28.12.2012, 22:05
    #38096703
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
ixilimuse,

А в какой кодировке вам нужны коды символов?
...
Рейтинг: 0 / 0
28.12.2012, 22:11
    #38096705
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
ixilimuse,

Что делать, если код символа вылезет за диапазон?
Код: plaintext
Chr(Ord(StrValue[I])+20);
...
Рейтинг: 0 / 0
28.12.2012, 22:17
    #38096709
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
в общем на скорую руку:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
namespace Encoding
{
    class Program
    {
        static void Main(string[] args)
        {
            var encoding = System.Text.Encoding.GetEncoding(1251);

            string oldText = "Hello, мир";
            Console.WriteLine(oldText);

            var oldBytes = encoding.GetBytes(oldText);
            var newBytes = oldBytes.Select(b => (Byte) (b + 20)).ToArray();
            var newText = encoding.GetString(newBytes);
            Console.WriteLine(newText);

            var newBytes2 = encoding.GetBytes(newText);
            var oldBytes2 = newBytes2.Select(b => (Byte)(b - 20)).ToArray();
            var oldText2 = encoding.GetString(oldBytes2);
            Console.WriteLine(oldText2);

            Console.ReadLine();
        }
    }
}
...
Рейтинг: 0 / 0
28.12.2012, 22:21
    #38096712
ixilimuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
Cat2, большое спасибо за идейку. Попробую в эту сторону поэкспериментировать. Да и более подробно по изучать эти типы в разрезе C#.

Arm79, кодировка нужна Unicode. ммм, полагаю utf16 если быть более точным.
По поводу диапазона. Механизм обкатывался какое-то время. В общем что бы выйти за диапазоны, смещение должно быть слишком большим (а оно таковым не является), либо символы должны быть рядом с пределом диапазона. Но в рамках реализуемой задачи такие ситуации не возникнут. Но замечание вполне справедливое - спасибо )
...
Рейтинг: 0 / 0
28.12.2012, 22:24
    #38096715
ixilimuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
Arm79, огромное спасибо за пример. Конечно внушающая конструкция получается )) Зато есть повод поучить язык и сам .Net.

Ещё раз спасибо за помощь )
...
Рейтинг: 0 / 0
29.12.2012, 09:48
    #38096935
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
ixilimuseкодировка нужна Unicode

В юникоде не всегда одному символу соответствует один код. Есть всяческие модифицирующие символы и прочее.

А зачем вообще что-то после преобразования делать текстом?
...
Рейтинг: 0 / 0
29.12.2012, 11:04
    #38096991
ixilimuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
Arm79,

Вся задача состоит в том что у меня есть проект написанный на Delphi. Он считывает номер карты, затем берез из базы ссылку и кодовое слово. И формирует результирующую ссылку с параметром. И вот этот самый параметр должен шифроваться. Он шифруется. Изначально планировалось что дешифрующие функции я выгружу в DLL. Но что-то как-то не удалось программистам проекта на ASP.NET воспользоваться моей библиотекой. А параметр то ведь надо расшифровывать)

Там по сути и несовместимость более чем уверен из-за разных типов строк происходит. Между моей библиотекой и проектом на ASP. Так как дело срочное, пробую всякие варианты и тот что будет самым быстрым тот временно и пустим в дело)

И вот как вариант начал переводить дешифровку на C#.

Кстати, модифицирующие символы.. Это конечно интересно. Надо будет посмотреть про них. Спасибо) Но вроде как на тестовых примерах таких ситуаций не возникало, по крайней мере при работе с delphi )
...
Рейтинг: 0 / 0
29.12.2012, 13:22
    #38097152
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
ixilimuseИзначально планировалось что дешифрующие функции я выгружу в DLL. Но что-то как-то не удалось программистам проекта на ASP.NET воспользоваться моей библиотекой.

Вы точно для функций поставили стандартную декларацию о вызовах? Да и если обмен идет строками, то использовали PChar (PWChar) для этого? Ведь стандартные строки без ShareMem ранее не шли

Кстати, я почему в примере выбрал 1251. У вас Chr(Ord( Значит используется не более 255 символов. В примере как раз таки и приводится все к типу byte.

ixilimuseИ вот этот самый параметр должен шифроваться
Шифрование вычитанием некоего числа из кода символа - это не шифрование, а недоразумение. Если стоит задача просто не заморачиваясь немного спрятать данные, преобразуйте строку в base64

Советую подумать над тем, чтобы полностью отказаться от Delphi при взамодействии с ASP.NET. Зачем мешанина из разных языков и платформ? Исходя из озвученной вами задачи (считать номер карты + получить и зашифровать параметр) работы там совсем немного
...
Рейтинг: 0 / 0
29.12.2012, 13:44
    #38097174
ixilimuse
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог Chr() и Ord() из delphi в С#
Arm79,

Да тут не все так просто и в тоже время очень просто :)

Кстати, ещё раз Вам огромное спасибо за идею, по поводу типов строк.. Да я использовал в объявлении stdcall. А вот тип данных использовал Юникодовские строки. И даже с Sharemem это не работает. Но вот с pchar & pwchar я ещё не пробовал билдить, а стоит =)

Я понимаю что мое шифрование не идеально, но по сути для этой задачи этого хватает. Там тем более идет не просто смещение на фиксированное значение, а по определенному алгоритму размер смещения меняется для каждого символа. Плюс получившийся результат преобразуется в строку вида %123C%321F ..

Тут конечно можно было бы сделать все по уму. Но увы мне эту задачу подсунули буквально за неделю до закрытия проекта. Причем я вообще наверное правильно сказать - подрядчик. Есть ВУЗ, куда внедряется проект. Есть компания которая внедряет проект, а я вообще случай оказался в этом замешан:) Просто нашли меня, и попросили что-нибудь придумать. Так как сроки горят, никто не берется.. Ну я и взялся, хотя даже пожалеть успел ввиду того что кучу нервов из-за срочности потратил =)

И почему сейчас я не могу браться за перевод всего проекта на Net - нет времени. Да и не заплатит никто за это)
По сути все что успел сделать за указанное время: поручить знакомому работу с железом. На базе его класса который работает с кардридером я написал софтинку которая читает карту. И в одном случае (если это терминал в корридоре) формируется ссылка и передается в барузер. А если это компьютер в библиотеки, происходит имитация действий пользователя. Открывается абоненмент читателя в программе Марк SQL. (Хотя при хорошем раскладе тут надо было связываться с разработчиками программы Марк. И они согласны реализовать поддержку устройства, проблема лишь в сроках)

Все это реализовано на дельфи. Что бы переписать все это на C#, учитывая отсутствие опыта в этом языке - мне потребуется много времени) Задача интересная но в любом случае не успеваю ) Разве что для себя побалуюсь)

И в общем-то местный (куда внедряется проект) программист сказал что ему будет достаточно библиотеки для того что бы он мог расшифровать параметр. Как мне сказали - я так и исполнил. Только вот о совместимости не подумал. Буду умнее в след. раз )

p.s. А сам проект - яркий пример того, как нельзя вести проекты ))
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Аналог Chr() и Ord() из delphi в С# / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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