Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с переводом C# на Delphi, перевести кусок кода на C# 
:(
    Опции темы
diablist
Дата 15.3.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.12.2007

Репутация: нет
Всего: нет



Помогите пожайлуста перевести эту функцию на Делфи:

Код

public class YouTubeDownloader: BaseVideoDownloader
    {
        public const string SiteName = "You Tube";

        //http://www.youtube.com/watch?v=5zOevLN3Tic
        public const string UrlPattern = @"(?:[Yy][Oo][Uu][Tt][Uu][Bb][Ee]\.[Cc][Oo][Mm]/watch\?v=)(\w[\w|-]*)";

        protected override ResourceLocation ResolveVideoURL(string url, string pageData, 
            out string videoTitle)
        {
            videoTitle = TextUtil.JustAfter(pageData, "<meta name=\"title\" content=\"", "\">"); 

            return ResourceLocation.FromURL(String.Format("{0}/get_video?video_id={1}&t={2}", TextUtil.GetDomain(url),
                TextUtil.JustAfter(url, "v=", "&"), TextUtil.JustAfter(pageData, "&t=", "&hl=")));
        }
    }
}


и еще этих парочку, если не тяжело

Код

internal static class TextUtil
    {
        internal static string JustBefore(string Str, string Seq)
        {
            string Orgi = Str;
            try
            {
                Str = Str.ToLower();
                Seq = Seq.ToLower();

                return Orgi.Substring(0, Str.Length - (Str.Length - Str.IndexOf(Seq)));
            }
            catch (Exception)
            {
                return "";
            }
        }

        internal static string GetDomain(String URL)
        {
            return URL.Substring(0, URL.LastIndexOf("/"));
        }

        internal static string GetFilename(String URL)
        {
            string Filename = URL.Substring(URL.LastIndexOf("/") + 2, URL.Length - URL.LastIndexOf("/") - 2);

            if (Filename.IndexOf("&") != -1)
                Filename = JustBefore(Filename, "&");

            return Filename;
        }

        internal static string JustAfter(string Str, string Seq, string SeqEnd)
        {
            string Orgi = Str;
            try
            {
                Str = Str.ToLower();
                Seq = Seq.ToLower();

                int i = Str.IndexOf(Seq);

                if (i < 0)
                    return null;

                i = i + Seq.Length;

                int j = Str.IndexOf(SeqEnd, i);
                int end;

                if (j > 0) end = j - i;
                else end = Str.Length - i;

                return Orgi.Substring(i, end);
            }
            catch (Exception)
            {
                return "";
            }
        }

        internal static string JustAfter(string Str, string Seq)
        {
            string Orgi = Str;
            try
            {
                Str = Str.ToLower();
                Seq = Seq.ToLower();

                int i = Str.IndexOf(Seq);

                if (i < 0)
                    return null;

                i = i + Seq.Length;

                return Orgi.Substring(i, Str.Length - i);
            }
            catch (Exception)
            {
                return "";
            }
        }
    }

PM MAIL   Вверх
Freak_FB
  Дата 15.3.2008, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: 1
Всего: 4



Если есть код, почему бы его не скомпилировать и не подключить как модуль уже в Делфи?


--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
diablist
Дата 15.3.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.12.2007

Репутация: нет
Всего: нет



Да мне все-го то нужно просто перевести процедуру, можно конечно и подключить, но мне хотелось бы перевести, чтоб понять как это работает  smile 

В особенности вот это
Код

public const string UrlPattern = @"(?:[Yy][Oo][Uu][Tt][Uu][Bb][Ee]\.[Cc][Oo][Mm]/watch\?v=)(\w[\w|-]*)";

PM MAIL   Вверх
Freak_FB
  Дата 15.3.2008, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: 1
Всего: 4



Нуу... если так
Этот код, от перевода на Delphi, понятней не станет, если ты не разбираешься в регулярных выражениях.
Насколько я сам в них разбираюсь (пока что не спец) - эта строка определяет шаблон для строки адреса типа той, что написана в комментарии к функции ResolveVideoUrl.
Вот только разбора адреса в приведённом тобою коде - не вижу.



--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
diablist
Дата 16.3.2008, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.12.2007

Репутация: нет
Всего: нет



В том-то и дело, что я тоже не могу понять, что это за регулярное выражение....

Вот еще одна, только для Google

Код

    public class GoogleVideoDownloader : BaseVideoDownloader
    {
        public const string SiteName = "Google Video";

        //http://video.google.com/videoplay?docid=6527966434248029824
        //http://video.google.com/videoplay?docid=-3840236067834151894
        public const string UrlPattern = @"(?:[Vv][Ii][Dd][Ee][Oo]\.[Gg][Oo][Oo][Gg][Ll][Ee]\.[Cc][Oo][Mm]/videoplay\?docid=)-?(\w[\w|-]*)";

        protected override ResourceLocation ResolveVideoURL(string url, string pageData,
            out string videoTitle)
        {
            videoTitle = TextUtil.JustAfter(pageData, "<title>", "</title>");

            url = TextUtil.JustAfter(pageData, "src=\"/googleplayer.swf?&videoUrl=", "&thumbnailUrl=");

            return ResourceLocation.FromURL(HttpUtility.UrlDecode(url));
        }
    }
}


А что с 
Код

TextUtil

Можно хоть одну процедуру перевести, чтоб я понял как остальные перевести?  smile 
PM MAIL   Вверх
Freak_FB
  Дата 16.3.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ктулхувед
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 13.10.2006

Репутация: 1
Всего: 4



Код

public const string UrlPattern = @"(?:[Yy][Oo][Uu][Tt][Uu][Bb][Ee]\.[Cc][Oo][Mm]/watch\?v=)(\w[\w|-]*)";


Знак @ - это понятно - строка, находящаяся за ней, воспринимается компилятором именно так, как она и написана, то есть без ESCAPE-последовательностей.
Далее первые скобки:
Код

?:[Yy][Oo][Uu][Tt][Uu][Bb][Ee]\.[Cc][Oo][Mm]/watch\?v=

Это значит что в строке адреса должна встретиться последовательность символов youtube (причём, каждая буква может быть как прописной так и строчной), далее идёт точка, сопровождённая обратной косой чертой - т.е. в терминах регулярных выражений - это просто точка после youtube и перед com. Так само и com - каждая буква может быть как прописной так и строчной. Дальше идёт участок текста /watch\?v= - определяет текст "/watch?v=" в адресе (вопросительный знак - тоже управляющий символ, поэтом перед ним тоже стоит обратная косая черта).
Вторая часть - во вторых скобках.
Код

\w[\w|-]*

Определяет шаблон слова (слово - любое сочетание букв от A до Z любого регистра, по-моему), после которого следует любое количество (в том числе и нулевое) слов или знаков "-".

А с переводом на Delphi'йский язык не помогу, ибо забыл за давностью. Юзай классы, скомпилированные шарпом.  smile 


--------------------
user posted image
user posted image
Тонет Ктулху, все медведы горят в огне.
Я Креведко, очень страшно сегодня мне.

PM MAIL ICQ Skype GTalk Jabber   Вверх
diablist
Дата 18.3.2008, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.12.2007

Репутация: нет
Всего: нет



Freak_FB, 
Спасибо большое, теперь понятно  smile 
Если кто сможет переведите плиз функции JustBefore JustAfter smile 
PM MAIL   Вверх
IApple
Дата 18.3.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Код

internal static string JustAfter(string Str, string Seq)
        {
            string Orgi = Str;
            try
            {
                Str = Str.ToLower();
                Seq = Seq.ToLower();

                int i = Str.IndexOf(Seq);

                if (i < 0)
                    return null;

                i = i + Seq.Length;

                return Orgi.Substring(i, Str.Length - i);
            }
            catch (Exception)
            {
                return "";
            }
        }


Функция корявая, потому как в случае ненахождения подстроки возвращает null, а в случае "аварии" - строку ""  8(.
Delphi не может "выплюнуть" из функции Null, если она должна возвращать строку, поэтому результат функции определен как Variant.
Код

function JustAfter(Str, Seq : string) : Variant;
var i: integer;
   Orgi : string;
begin
  Orgi:=Str;
  try
    Str:=LowerCase(Str);
    Seq:=LowerCase(Seq);
    i:=Pos(Seq,Str);
    if i=0
      then Result:=Null
      else begin
        i:=i+Length(Seq);
        Result:=copy(Orgi,i,Length(Str));
        end;
  except
    Result:='';
  end;
end;

PM MAIL   Вверх
diablist
Дата 18.3.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.12.2007

Репутация: нет
Всего: нет



IApple, 
Спасибо большое, да ничего, главное что я теперь вижу на нужном языке все  smile , а там я уже как-то доработаю  smile 
PM MAIL   Вверх
Defm
Дата 7.4.2008, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 7.4.2008

Репутация: нет
Всего: нет



Ну собственно подобный же вопрос... Есть код на c# в котором я ни бум-бум. 
Я смутно догадываюсь что формируется сетевой пакет, и отправляется на порт локальной машины... 
Но проводить аналоги между С# NetworkStream, BinaryReader  и делфийскими TWinSocketStream
классами пока боязно. 
Присвоения, работа циклов, и CreateJoinPacket(), ReadConfigFile(), WriteConfigFile меня не интересуют, 
проблема только в реализации 'сетевой' части..
Код

        public void RefreshCycle()
        {
            ReadConfigFile();
            m_InitEvent.Set();
            m_IsRefreshRunning = true;
            m_GameState = GameSlotState.Available;


            UpdateLog(DateTime.Now.ToString() + " - Initialized Autorefresh.\r\n");

            int NameCounter = 0;
            int HostCounter = 0;
            bool SuccessfulRefresh = false;

            while(m_IsRefreshRunning)
            {
                try
                {
                    TcpClient[] DummyClients = new TcpClient[MAX_SLOTS];
                    NetworkStream[] DummyStreams = new NetworkStream[MAX_SLOTS];
                    BinaryReader[] DummyReaders = new BinaryReader[MAX_SLOTS];
                    BinaryWriter[] DummyWriters = new BinaryWriter[MAX_SLOTS];
                    int SlotsUsed = 0;
                    try
                    {
                        m_GameState = GameSlotState.Available;
                        for(int i = 0; i < MAX_SLOTS-1 && m_GameState == GameSlotState.Available && m_IsRefreshRunning; i++)
                        {
                            DummyClients[i] = new TcpClient("localhost",m_PortNumber);
                            DummyStreams[i] = DummyClients[i].GetStream();
                            DummyReaders[i] = new BinaryReader(DummyStreams[i]);
                            DummyWriters[i] = new BinaryWriter(DummyStreams[i]);

                            byte[] JoinPacket;
                            switch(m_NameOption)
                            {
                                case 2:
                                {
                                    switch(NameCounter)
                                    {
                                        case 1:
                                        {
                                            JoinPacket = new byte[53] {
                                                                          0xF7, 0x1E, 0x35, 0x00, (byte) HostCounter, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x17, 0x00,
                                                                          0x00, 0x00, 0x00, 0x7C, 0x72, 0x4E, 0x4F, 0x20, 0x47, 0x41, 0x4D, 0x45, 0x20, 0x53, 0x54, 0x41,
                                                                          0x52, 0x54, 0x00, 0x01, 0x00, 0x02, 0x00, 0x17, 0xE0, 0x7F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
                                                                          0x00, 0x00, 0x00, 0x00, 0x00
                                                                      };
                                            break;
                                        }
                                        case 2:
                                        {
                                            JoinPacket = new byte[53] {
                                                                          0xF7, 0x1E, 0x35, 0x00, (byte) HostCounter, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x17, 0x00,
                                                                          0x00, 0x00, 0x00, 0x7C, 0x72, 0x48, 0x4F, 0x53, 0x54, 0x20, 0x49, 0x53, 0x20, 0x41, 0x46, 0x4B,
                                                                          0x21, 0x21, 0x00, 0x01, 0x00, 0x02, 0x00, 0x17, 0xE0, 0x7F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
                                                                          0x00, 0x00, 0x00, 0x00, 0x00
                                                                      };
                                            break;
                                        }
                                        case 3:
                                        {
                                            JoinPacket = new byte[53] {
                                                                          0xF7, 0x1E, 0x35, 0x00, (byte) HostCounter, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x17, 0x00,
                                                                          0x00, 0x00, 0x00, 0x7C, 0x72, 0x44, 0x4C, 0x20, 0x41, 0x4E, 0x44, 0x20, 0x4C, 0x45, 0x41, 0x56,
                                                                          0x45, 0x21, 0x00, 0x01, 0x00, 0x02, 0x00, 0x17, 0xE0, 0x7F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
                                                                          0x00, 0x00, 0x00, 0x00, 0x00
                                                                      };
                                            break;
                                        }
                                        default:
                                        {
                                            JoinPacket = new byte[53] {
                                                                          0xF7, 0x1E, 0x35, 0x00, (byte) HostCounter, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x17, 0x00,
                                                                          0x00, 0x00, 0x00, 0x7C, 0x72, 0x44, 0x4F, 0x57, 0x4E, 0x4C, 0x4F, 0x41, 0x44, 0x20, 0x4F, 0x4E,
                                                                          0x4C, 0x59, 0x00, 0x01, 0x00, 0x02, 0x00, 0x17, 0xE0, 0x7F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
                                                                          0x00, 0x00, 0x00, 0x00, 0x00
                                                                      };
                                            break;
                                        }
                                    }
                                    NameCounter = ++NameCounter % 4;
                                    break;
                                }

                                case 3:
                                {
                                    try
                                    {
                                        JoinPacket = CreateJoinPacket(m_NameList[NameCounter].Name, false, (byte) HostCounter);
                                    }
                                    catch
                                    {
                                        throw new Exception("There are no custom names to refresh with. Change the name options to resume refreshing.");
                                    }
                                    NameCounter = ++NameCounter % m_NameList.Length;
                                    break;
                                }
                                case 4:
                                {
                                    try
                                    {
                                        JoinPacket = CreateJoinPacket(m_NameList[NameCounter].Name, true, (byte) HostCounter);
                                    }
                                    catch
                                    {
                                        throw new Exception("There are no custom names to refresh with. Change the name options to resume refreshing.");
                                    }
                                    NameCounter = ++NameCounter % m_NameList.Length;
                                    break;
                                }
                                case 5:
                                {
                                    try
                                    {
                                        JoinPacket = CreateJoinPacket(m_NameList[NameCounter].Name, m_NameList[NameCounter].Color, (byte) HostCounter);
                                    }
                                    catch
                                    {
                                        throw new Exception("There are no custom names to refresh with. Change the name options to resume refreshing.");
                                    }
                                    NameCounter = ++NameCounter % m_NameList.Length;
                                    break;
                                }

                                default:
                                {
                                    JoinPacket = new byte[51] {
                                                                  0xF7, 0x1E, 0x33, 0x00, (byte) HostCounter, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x17, 0x00,
                                                                  0x00, 0x00, 0x00, 0x7C, 0x72, 0x41, 0x75, 0x74, 0x6F, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68,
                                                                  0x00, 0x01, 0x00, 0x02, 0x00, 0x17, 0xE0, 0x7F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
                                                                  0x00, 0x00, 0x00
                                                              };
                                    break;
                                }
                            }

                            //                                    JoinPacket = new byte[65] {
                            //                                                                  0xF7, 0x1E, 0x41, 0x00, HostCounter[0], 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x17, 0x00,
                            //                                                                  0x00, 0x00, 0x00, 0x7C, 0x43, 0x46, 0x46, 0x30, 0x30, 0x34, 0x32, 0x46, 0x46, 0x44, 0x6F, 0x77,
                            //                                                                  0x6E, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x4F, 0x6E, 0x6C, 0x79, 0x21, 0x21, 0x7C, 0x72, 0x00, 0x01,
                            //                                                                  0x00, 0x02, 0x00, 0x17, 0xE0, 0x7F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                            //                                                                  0x00
                            //                                                              };
                            
                            DummyWriters[i].Write(JoinPacket);

                            byte[] ResponsePacket = new byte[5];

                            for(int h = 0; h < ResponsePacket.Length; h++)
                            {
                                ResponsePacket[h] = DummyReaders[i].ReadByte();
                            }
                            if(ResponsePacket[1] == 5 && ResponsePacket[2] == 8)
                            {
                                if(ResponsePacket[4] == 9)
                                    m_GameState = GameSlotState.Full;
                                else if(ResponsePacket[4] == 10)
                                    m_GameState = GameSlotState.Started;
                                else if(ResponsePacket[4] == 7)
                                {
                                    HostCounter = ++HostCounter % 256;
                                    i--;
                                }
                                if(--NameCounter < 0)
                                    NameCounter = 0;
                            }

                            SlotsUsed += 1;
                        }
                        if(!SuccessfulRefresh)
                        {
                            SuccessfulRefresh = true;
                            UpdateLog(DateTime.Now.ToString() + " - Game successfully refreshing.\r\n");
                        }
                    }
                    finally
                    {
                        for(int i = 0; i < SlotsUsed; i++)
                        {
                            if(DummyWriters[i] != null) DummyWriters[i].Close();
                            if(DummyReaders[i] != null) DummyReaders[i].Close();
                            if(DummyStreams[i] != null) DummyStreams[i].Close();
                            if(DummyClients[i] != null) DummyClients[i].Close();
                        }
                    }
                }
                catch(Exception ex)
                {
                    UpdateLog(DateTime.Now.ToString() + " - Error: " + ex.Message + ".\r\n");
                    SuccessfulRefresh = false;
                }
                
                if(m_GameState == GameSlotState.Started && m_RefreshRate < 30000)
                    m_RefreshTimer = 30000;
                else
                    m_RefreshTimer = m_RefreshRate;
                while(m_RefreshTimer > 0 && m_IsRefreshRunning)
                {
                    Thread.Sleep(1000);
                    m_RefreshTimer -= 1000;
                }
            }
            WriteConfigFile();
        }



Спасибо заранее.
ЗЫ: Остальной код тоже в наличии, если требуется.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1892 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.