Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2011, 17:29   #1
d3[Z.oRg]
 
Регистрация: 20.04.2008
Сообщений: 8
По умолчанию из pascal в c#

Шифр Гронсфельда
http://www.cyberforum.ru/pascal/thread33245.html
по ссылке реализовано на паскале. но после него C# как снег на голову с его кривой реализацией некоторых функций аля ord и chr (понятно что надо привыкнуть) и объявлением функций
Код:
function GronsfeldEncipher(toCode, K: string): string;
var i, T, _T: integer;
begin
  for i := 1 to length(toCode) do begin
    _T := ord(toCode[ i ]);
 
    T := (Ord(toCode[ i ])
 
      +
      (Ord(K[(pred(i) mod length(K)) + 1]) - Ord('0'))
 
         );
 
    if T >= 256 then dec(T, 256);
    toCode[ i ] := Chr(T);
  end;
  GronsfeldEncipher := toCode;
end;
 
 
function GronsfeldDecipher(toDecode, K: string): string;
var i, T: integer;
begin
  for i := 1 to length(toDecode) do begin
    T := (Ord(toDecode[i])
 
      -
      (Ord(K[(pred(i) mod length(K)) + 1]) - Ord('0'))
 
         );
    if T < 0 then Inc(T, 256);
    toDecode[ i ] := Chr(T);
  end;
  GronsfeldDecipher := toDecode;
end;
 
var
  s: string;
 
begin
  s := GronsfeldEncipher('INFORMATION', '2178');
  writeln(s);
  writeln('s = ', GronsfeldDecipher(s, '2178'));
end.
орд получился как (int)tocode[i], а мод - %
перегнать Chr и заставить его вменяемо работать не получилось. помогите пожалуйста
d3[Z.oRg] вне форума Ответить с цитированием
Старый 16.02.2011, 17:33   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А не проще ли работать с байтами, чем так измываться над юникодными строками?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 16.02.2011, 17:51   #3
b2soft
Упртй программер
Форумчанин
 
Регистрация: 26.11.2009
Сообщений: 150
По умолчанию

Юникод - не мазохист ведь =)))

Правильно товарисч сказал. Работайте с байтами. Проще будет. гугл в помосч
Помощь с кодом/лабами по С/С++
Контакты: ICQ 623334555 Skype: btwosoft; Mail: b2soft@yandex.ru
b2soft вне форума Ответить с цитированием
Старый 16.02.2011, 18:08   #4
d3[Z.oRg]
 
Регистрация: 20.04.2008
Сообщений: 8
По умолчанию

toCode[ i ] := Chr(T);
toCode[ i ] = (char)T; - должно быть так, но получается какая-то нелепая ошибка при компиляции. завтра могу закинуть то что получилось, сегодня скопировал не тот проект на флешку :\
и возвращаемое значение тогда должно быть в функциях как
return toCode/toDecode ?
d3[Z.oRg] вне форума Ответить с цитированием
Старый 16.02.2011, 21:46   #5
d3[Z.oRg]
 
Регистрация: 20.04.2008
Сообщений: 8
По умолчанию

собственно вот что получается
Код:
using System;
namespace Gronsfeld
{
    class encode_decode
    {   
        //ecn_START
        public string GronsfeldEncipher(string toCode, string K)
        {
            //string toCode = null;
           
                for (int i=1; i<toCode.Length; i++)
                {

                  int _T = (int)(toCode[ i ]);
 
                   int T = (int)(((toCode[ i ]) + (int)(K[((i-1) % (K.Length)) + 1]) - (int)('0')));
 
                if (T >= 256) 
                    T-= 256;
                toCode[i] = char(T);

                }
         return toCode;
        }//enc_END
    
        //dec_START
        public string GronsfeldDecipher(string toDecode, string K)
        {
                       
                for (int i=1; i<toDecode.Length; i++)
                {

                int T = (int)(((toDecode[i]) - (int)(K[((i-1) % (K.Length)) + 1]) - (int)('0')));
                if (T < 0)
                    T+=256;
                toDecode[i] = char(T);

                 }
        return toDecode;
        }//dec_END



        static void Main()
        {
            Console.WriteLine("Hello World!");
            string a = "hello";
            string b = "qwe";
             string s = GronsfeldEncipher(a, b);
            Console.WriteLine(s);

            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();


        }
    }
}
c:\users\d3zorg\documents\visual studio 2010\Projects\ConsoleApplication1\C onsoleApplication1\Program.cs(21,33 ): ошибка CS1525: Недопустимый элемент "char" в выражении
c:\users\d3zorg\documents\visual studio 2010\Projects\ConsoleApplication1\C onsoleApplication1\Program.cs(36,35 ): ошибка CS1525: Недопустимый элемент "char" в выражении
c:\users\d3zorg\documents\visual studio 2010\Projects\ConsoleApplication1\C onsoleApplication1\Program.cs(48,25 ): ошибка CS0120: Для нестатического поля, метода или свойства "Gronsfeld.encode_decode.GronsfeldE ncipher(string, string)" требуется ссылка на объект
c:\users\d3zorg\documents\visual studio 2010\Projects\ConsoleApplication1\C onsoleApplication1\Program.cs(8,23) : (Связанное местоположение)
d3[Z.oRg] вне форума Ответить с цитированием
Старый 17.02.2011, 11:40   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) посмотрите тему С# HexToStr - там, думаю, найдёте немало полезных в данной задаче трюков.

2) какая цель написания Вами данного кода?
И почему в основной программе не вызывается функция расшифровки ?!

3) при данном алгоритме шифрования легко получаются не буквенно-цифровые коды (т.е. их отображение напрямую может зависеть от используемой таблицы символов), т.е. в консоле, при выводе зашифрованного текста легко получить "непечатные" символы. Это Вас не пугает?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.02.2011, 12:30   #7
d3[Z.oRg]
 
Регистрация: 20.04.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1) посмотрите тему С# HexToStr - там, думаю, найдёте немало полезных в данной задаче трюков.

2) какая цель написания Вами данного кода?
И почему в основной программе не вызывается функция расшифровки ?!

3) при данном алгоритме шифрования легко получаются не буквенно-цифровые коды (т.е. их отображение напрямую может зависеть от используемой таблицы символов), т.е. в консоле, при выводе зашифрованного текста легко получить "непечатные" символы. Это Вас не пугает?
1) ни о чем
2) цель - чтобы алгоритм работал, а то что нету функции дешифрации так это не проблема, уже вызвали как отладили
3) в оригинале использовались только цифровой ключ, с символьными я уже поигрался, вышло очень интересно, но это уже другая история.
если кому интересно то вот голый рабочий вариант без извращений
Код:
using System;
namespace Gronsfeld
{
    static class encode_decode
    {
        //ecn_START
        public static string GronsfeldEncipher(string toCode, string K)
        {
            //string toCode = null;
            string result="";
            for (int i = 0; i < toCode.Length; i++)
            {
 
                int _T = (int)(toCode[i]);
 
                int T = (int)toCode[i] + ((int)(K[((i) % (K.Length)) ]) - (int)('0'));
 
                if (T >= 256)
                    T -= 256;
                
 
                result += (char)T;
                
            }
            return result;
        }//enc_END
 
        //dec_START
        public static string GronsfeldDecipher(string toDecode, string K)
        {
            string result="";
 
            for (int i = 0; i < toDecode.Length; i++)
            {
 
                int T = (int)(toDecode[i]) - ((int)(K[((i) % (K.Length))]) - (int)('0'));
                if (T < 0)
                    T += 256;
                
                result += (char)T;
                
 
            }
            return result;
        }//dec_END
 
 
 
        static void Main()
        {
            Console.WriteLine("Hello World!");
            string a = "hello";
            string b = "666";
            string s = GronsfeldEncipher(a, b);
            Console.WriteLine(s);
            string d = GronsfeldDecipher(s, b);
            Console.WriteLine(d);
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
 
 
        }
    }
}
d3[Z.oRg] вне форума Ответить с цитированием
Старый 17.02.2011, 12:59   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
то вот голый рабочий вариант ...
значит задача решена. ну и славно.

Цитата:
Код:
int _T = (int)(toCode[i]);
эта строчка абсолютно не нужна! И в коде на Pascal, ни в коде на C#!!
Уберите её совсем.


___________________________
ДОБАВЛЕНО

Цитата:
1) ни о чем
ни о чём, говорите... и задача уже решена? А если в строке есть русские буквы? Всё нормально работает?
Или это неважно?

Последний раз редактировалось Serge_Bliznykov; 17.02.2011 в 13:38.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal zumm Свободное общение 11 09.12.2010 15:32
Turbo Pascal or Pascal ABC Ikram Паскаль, Turbo Pascal, PascalABC.NET 0 27.04.2010 13:44
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28
Перевод кода из Pascal в Object Pascal zemskov77 Общие вопросы Delphi 1 03.01.2009 09:37