Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Помогите перевести с C# на Delphi base256


Автор: x0x0x0 12.4.2015, 07:43
Вот есть достаточно простой код, но немогу его перевести :( 

Код

{
    public class Base256 : Base
    {
        public const string DefaultAlphabet = "!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁł";
        public const char DefaultSpecial = (char)0;

        public override bool HaveSpecial
        {
            get { return false; }
        }

        public Base256(string alphabet = DefaultAlphabet, char special = DefaultSpecial,
            Encoding textEncoding = null)
            : base(256, alphabet, special, textEncoding)
        {
        }

        public override string Encode(byte[] data)
        {
            StringBuilder result = new StringBuilder(data.Length);

            for (int i = 0; i < data.Length; i++)
                result.Append(Alphabet[data[i]]);

            return result.ToString();
        }

        public override byte[] Decode(string data)
        {
            unchecked
            {
                byte[] result = new byte[data.Length];

                for (int i = 0; i < data.Length; i++)
                    result[i] = (byte)InvAlphabet[data[i]];

                return result;
            }
        }
    }
}

Автор: Illusion Dolphin 12.4.2015, 13:59
А что не получается? 
Код

const
  Alphabet = '!#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}' + '~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁł';

function Encode(Data: TByteArray): string;
var
  I: Integer;
begin
  Result := '';
  for I := 0 to Length(Data) - 1 do
    Result := Result + Alphabet[Data[I]];
end

function Decode(Data: string): TByteArray;
var
  I: Integer;
begin
  SetLength(Result, Length(Data));

  for I := 0 to length - 1 do
     Result[I] = Byte(InvAlphabet[Data[I]]);
end;


Автор: x0x0x0 12.4.2015, 22:50
Код не рабочий 

Код

function Encode(Data: TBytes): string;
var
  I: Integer;
begin
  Result := '';
  for I := 0 to Length(Data) - 1 do
    Result := Result + Alphabet[Data[I] + 1] ; ----- Разве не нужно +1 ? а какже #0 ?
end;


function Decode(Data: string): TBytes;
var
  I: Integer;
begin
  SetLength(Result, Length(Data));

  for I := 0 to Length(Data) - 1 do
   .........  Result[I] :=   Byte( Alphabet[Data[I]] ); ----------- такая магия в Delphi не работает ;)
end;

Автор: Illusion Dolphin 13.4.2015, 09:39
Цитата

Разве не нужно +1 

Да, тут +1 нада

Цитата

Result[I] :=   Byte( Alphabet[Data[I]] ); ----------- такая магия в Delphi не работает ;)

А вы тут зря мой код так меняете, тут надо +1, как уже вы заметили выше, и InvAlphabet который находится в базовом классе Base

Автор: x0x0x0 13.4.2015, 15:36
Illusion Dolphin, 
Цитата(Illusion Dolphin @  13.4.2015,  09:39 Найти цитируемый пост)
А вы тут зря мой код так меняете, тут надо +1, как уже вы заметили выше, и InvAlphabet который находится в базовом классе Base 


А это в каком юните ?

Автор: Illusion Dolphin 13.4.2015, 16:31
Цитата

А это в каком юните ?

https://github.com/KvanTTT/BaseNcoding/blob/master/BaseNcoding/Base.cs, откуда вы копировали

Автор: x0x0x0 13.4.2015, 18:28
Illusion Dolphin, А как для Delphi такое сделать ?

Автор: Illusion Dolphin 14.4.2015, 00:27
Посмотрите тут http://cybern.ru/delphi-class-inheritance.html или другие ссылке по теме наследование.

Автор: x0x0x0 14.4.2015, 01:26
Illusion Dolphin, А причем тут наследование, я про InvAlphabet , его как в делфи с C# перевести ? smile 

Автор: Illusion Dolphin 14.4.2015, 12:26
Цитата

А причем тут наследование

Ну вы точнее спрашивайте, мне лично не понятно что у вас не получается перевести. Покажите наработки что-ли.

Автор: x0x0x0 14.4.2015, 12:51
Illusion Dolphin, 

только так, но это не работает :(

Код


   function InvAlphabet(S: String): Integer;
   begin
     for Result := 1 to 256 do
     if CompareStr(s, Alphabet[Result]  ) = 0 then  Exit;
     Result := -1;
   end;


function Decode(Data: string): TBytes;
var
  I: Integer;
begin
  SetLength(Result, Length(Data));
  for I := 1 to Length(Data) - 1 do
    Result[I] :=   Byte( InvAlphabet[Data[I]]-1 ); 
end;



Автор: Illusion Dolphin 16.4.2015, 08:03
Цитата

только так, но это не работает :(

А как оно может работать, если вы функцию InvAlphabet с параметром стринговым пишите с квадратными скобками как массив да и ещё индексируете по целочисленному. А что вы делаете вообще, если не секрет?

Я ещё могу понять вот такое:
Код

   function InvAlphabet(S: Char): Integer;
   begin
     for Result := 1 to 256 do
     if s = Alphabet[Result] then Exit;
     Result := -1;
   end;
function Decode(Data: string): TBytes;
var
  I: Integer;
begin
  SetLength(Result, Length(Data));
  for I := 1 to Length(Data) - 1 do
    Result[I] :=   Byte( InvAlphabet(Data[I])-1 ); 
end;


Но всё равно выглядит это как-то странно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)