[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    человек, ты жжжеш. переименуй файл и будет будет отлично ))
    А если ты хочешь чтобы был текстовый формат, то просто побайтно перегони в HEX или целеком в base64
    Ты бы еще спросил как из перегнать txt в avi
     
  2. DiSi

    DiSi Member

    Joined:
    7 Dec 2007
    Messages:
    0
    Likes Received:
    19
    Reputations:
    0
    хм))
    подскажите как перегнать в бас64?)
     
  3. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Смотря что перегонять:

    К примеру из строки:

    Code:
    StrToInt64('100')
    А вот мой вопросик:

    Отправляю GET запрос через сокет на http://testhtl.ucoz.ru/ получаю нормальный ответ отправляю на: http://testhtl.ucoz.ru/mchat/ получаю:

    Code:
    HTTP/1.1 200 OK
    Server: uServ/1.1.0
    Date: Fri, 21 Aug 2009 18:10:35 GMT
    Content-Type: text/html; charset=UTF-8
    Last-Modified: Fri, 21 Aug 2009 18:05:59 GMT
    Transfer-Encoding: chunked
    Connection: keep-alive
    Keep-Alive: timeout=15
    Cache-Control: no-cache
    Pragma: no-cache
    Content-Encoding: gzip
    
    a
    ‹
    как получить нормальный ответ? (С HTML кодом)
     
  4. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    GZIP убери, когда отправляешь сокеты.
     
    3 people like this.
  5. DiSi

    DiSi Member

    Joined:
    7 Dec 2007
    Messages:
    0
    Likes Received:
    19
    Reputations:
    0
    как сделать побайтовое чтение файла? (.jpg)

    если можна на примере
     
  6. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    как грамотно сделать чтобы приложение не зависало во время ожидание ответа?
     
  7. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    DiSi

    Code:
    program PicToTxt;
    
    uses
      SysUtils;
    
    var
      picture1: file of char;
      picture2:textfile;
      txt_file:textfile;
      i:integer; 
      chr:char;
      hex_chr:string[2];
      buff:widestring;
    
    
    {functions}
    function ChrToHex(S: Char): String;
    begin
       Result:= IntToHex(ord(S),2);
    end;
    
    function HexToChr(H: String): Char;
    begin
       Result:= Char(StrToInt('$'+Copy(H,1,2)));
    end;
    
    {program start}
    begin
    
          {convert pic->txt}
          buff:='';
          assignfile(picture1,'c:\avata.gif');
          reset(picture1);
          for i:=1 to filesize(picture1) do
          begin
            read(picture1,chr);
            buff:=buff+ChrToHex(chr);
          end;
          closefile(picture1);
    
          assignfile(txt_file,'c:\txt_file.txt');
          rewrite(txt_file);
          write(txt_file,buff);
          closefile(txt_file);
    
    
          {convert txt->pic}
          buff:='';
          assignfile(txt_file,'c:\txt_file.txt');
          reset(txt_file);
          while not EOF(txt_file) do
          begin
             read(txt_file,hex_chr);
             chr:=HexToChr(hex_chr);
             buff:=buff+chr;
          end;
          closefile(txt_file);
    
          assignfile(picture2,'c:\avata2.gif');
          rewrite(picture2);
          write(picture2,buff);
          closefile(picture2);
    
    
    end.
    код подходит для обработки небольших файлов(не только картинок), для б0льших - вместо widestring (в качестве буффера) надо будет, конечно, использовать что-нибудь по-серьёзнее
     
    #3967 ErrorNeo, 22 Aug 2009
    Last edited: 22 Aug 2009
    2 people like this.
  8. DiSi

    DiSi Member

    Joined:
    7 Dec 2007
    Messages:
    0
    Likes Received:
    19
    Reputations:
    0
    ErrorNeo, СПС!!!!))) помог)

    ы)
    PHP:
    write(pic2,hex_chr); 
    тут ошибка(

    Incompatible types: 'Char' and 'String'

    ето когда переделует картинку в тхт((
     
    #3968 DiSi, 22 Aug 2009
    Last edited: 22 Aug 2009
  9. cremator (c)

    cremator (c) Elder - Старейшина

    Joined:
    20 Jun 2008
    Messages:
    258
    Likes Received:
    72
    Reputations:
    0
    НTL, надо делать в отдельном потоке всё!)) Если ты на сокетах делаешь, без всяких индей и прочей хрени, то в главном потоке всё делать это махохизм)
    Вот можешь поизучать исходнички http sender (slesh'a), сам на его основе строю запросы. http://slil.ru/27918620
     
    #3969 cremator (c), 22 Aug 2009
    Last edited: 22 Aug 2009
  10. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    НTL, у тебя зависает на функции "recv"?

    если да, то:
    Code:
    const
    GP_TIMEOUT=10000; //это значит таймаут ожидания ответа 10 секунд
    +
    Code:
    function recvdata(sock:TSocket):string;
    var
      tv : timeval;
      fds : TFDSet;
      buf : array [1..20000] of char;
      res : string;
      r : integer;
      i:integer;
      inc,tmp:integer;
    begin
      r:=1;
      while (r>0) do
      begin
        FD_ZERO(fds);
        FD_SET(sock, fds);
        tv.tv_sec := GP_TIMEOUT div 1000;
        tv.tv_usec := (GP_TIMEOUT mod 1000) * 1000;
        i := select(0, @fds, nil, nil, @tv);
        if (i <= 0) then
        begin
          break;
        end;
        r := recv(sock, buf, 20000, 0);
        res:=res+copy(buf,1,r);
      end;
      result:=res;
    end;
    ну и теперь просто вместо, к примеру,

    recv(s,sBuff,5000,0);
    юзаешь
    reply:=recvdata(s);
    где s:TSOCKET;

    эта функция
    Code:
    uses
      Windows
     
    #3970 ErrorNeo, 22 Aug 2009
    Last edited: 22 Aug 2009
    1 person likes this.
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 ErrorNeo короче будет если задать таймаут самому сокету
    типа
    timeout.tv_usec = 0;
    timeout.tv_sec = RECV_TIMEOUT;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(TIMEVAL));

    тогда recv будет автоматом вылетать через RECV_TIMEOUT милесекунд.
    т.е. чтобы был таймаут 10 сек нужно RECV_TIMEOUT = 10000;
    А потом когда это уже не нужно можно снять таймаут
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, 0, 0);
     
  12. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    уже 2 дня пытаюсь получить HTML код от http://testhtl.ucoz.ru/mchat/

    Вот код:
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Winsock;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo2: TMemo;
        Label2: TLabel;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
    IP: string; 
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    function HostToIP(Name: string; var Ip: string): Boolean;
    var wsdata : TWSAData;
    hostName : array [0..255] of char;
    hostEnt : PHostEnt;
    addr : PChar;
    begin WSAStartup ($0101, wsdata);
    try gethostname (hostName, sizeof (hostName));
    StrPCopy(hostName, Name);
    hostEnt := gethostbyname (hostName);
    if Assigned (hostEnt) then if Assigned (hostEnt^.h_addr_list) then begin addr := hostEnt^.h_addr_list^;
    if Assigned (addr) then begin IP := Format ('%d.%d.%d.%d', [byte (addr [0]),byte (addr [1]), byte (addr [2]), byte (addr [3])]);
    Result := True;
    end else Result := False;
    end else Result := False else begin Result := False;
    end;
    
    finally
    WSACleanup;
    end
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
     s:TSocket;
     Ws:TWSAData;
     addr:sockaddr_in;
     se, START_TEXT, STOP_TEXT:string;
     login:string;
     buf:  array[0..123123] of Char;
     buf2: array[0..123123] of Char;
       sss, zhtml :string;
       Shtml :Integer;
    begin
     HostToIp(form1.Edit1.Text, IP);
     WSAStartup($101,Ws);
     s:=socket(af_inet, SOCK_STREAM, 0);
     addr.sin_family:=af_inet;
     addr.sin_port:=htons(80);
     addr.sin_addr.S_addr:=inet_addr(pchar(ip));
     connect(s,addr,sizeof(addr));
    
        se:='GET /mchat/ HTTP/1.1'#13#10+
        'Host: '+form1.Edit1.Text+#13#10+
        'User-Agent: Mozilla/5.0 (Windows; ; Windows NT 5.1; rv:1.9.1.2) Gecko/20090729 YB/4.2.0.c'#13#10+
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'#13#10+
        'Accept-Language: ru'#13#10+
        'Accept-Encoding: deflate'#13#10+
        'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'#13#10+
        'Keep-Alive: 300'#13#10+
        'Connection: Keep-Alive' + #13#10+#13#10;
    
     CopyMemory(@buf, PChar(se), Length(se));
     send(s,buf,SizeOf(buf),0);
     recv(s,buf2,SizeOf(buf2),0);
     Memo2.Lines.Text:=buf2;
     closesocket(s);
    end;
    
    end.
    
    HTML приходит через раз, и если приходит то не весть код а тока часть...

    //Help...
     
  13. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Кинь на форму IdHTTP.
    RichEdit1.Text:=idhttp1.Get('http://www.mysite.ru/');
     
  14. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Я в курсе, надо сокеты
     
  15. cremator (c)

    cremator (c) Elder - Старейшина

    Joined:
    20 Jun 2008
    Messages:
    258
    Likes Received:
    72
    Reputations:
    0
    HTL,дружище. покури сорцы сендера, что я скинул:))
     
  16. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    циклом читай
     
  17. Dr.Perry_Cox

    Dr.Perry_Cox Member

    Joined:
    24 May 2009
    Messages:
    16
    Likes Received:
    10
    Reputations:
    0
    А может кто нибудь посоветовать книги по изучению Паскаля для новичка?
     
  18. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    В http://slil.ru/27918620 (http sender (slesh'a))

    Code:
    procedure TForm1.Button8Click(Sender: TObject);
    var
     thId:cardinal;
    begin
     CreateThread(0,0,@Getdata,nil,0,thid);
     
    {
      Мой код, который надо выполнять после получения ответа
        }
    
    end;
    
    Как мне выполнить свой код, после получение ответа?
     
  19. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    Поищи по форуму, там есть темы по литературе, а сдесь задают вопросы по кодингу.
     
  20. wolmer

    wolmer Member

    Joined:
    12 May 2009
    Messages:
    438
    Likes Received:
    97
    Reputations:
    9
    Что мешает сравнить строки куда пришел ответ (к примеру если первая строка(куда принимался ответ) пуста то значит нету ответа и ничего делать не надо)
     
Thread Status:
Not open for further replies.