Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Byte-toString Wandler (https://www.delphipraxis.net/83502-byte-tostring-wandler.html)

Lord of Ghosts 3. Jan 2007 19:29


Byte-toString Wandler
 
Hallo ,

ich habe eine Frage zu dem Code , den ich letztens geschrieben habe , um Dateiübertragungen auf den
"alten" ( Delphi 6 ) Winsocks zu realisieren ( ich hab' das Versenden von Dateien auch schon mit
Streams ausprobiert , baer nach max. 740 KB hat die Übertragung jedesmal abgebrochen..ein paar
befreundete Programmierer meinten dazu , dass ich einfach auf Indy umsteigen soll , was aber
aufgrund der Größe des schon geschriebenen Codes für mich reichlich unpraktisch ist ...).

Zum besseren Verständnis beschreibe ich hier erstmal meine Methode dabei :

Da bei mir die Konvertierung von Dateien in Strings immer wieder felgeschlagen ist , habe ich mich
entschieden , die Datei auf der Byte Ebene auszulesen und diese Werte in einen String zu packen (
mit der kleinen Eigenheit , dass ich jeden Bytewert auf drei Stellen bringe , dann fällt mir das
auslesen am anderen Ende der Leitung leichter^^) , den ich dann mit
clientsocket.socket.sendtext("filestring")[i] verschicke und am anderen Ende auslese,in eine
Datei schreibe und dann ins ursprüngliche Format konvertiere.

Jetzt würde ich gerne wissen ob und wie man die Konvertierung von bytewerten zu einer Zeichenkette
optimieren kann und was man dafür tun muss , denn die Konvertierung von einer Datei zu einem String
dauert , wenn diese größer 1MB ist , schon ziemlich lange ( >3min. auf einem 300+ Athlon XP ) und
ich müsste diesen Prozess eigentlich noch um einiges beschleunigen...

Hier mein Konvertierungsquellkode :

var
fn:string; // filename
streamconv:Tstream; // Stream für die Originaldatei
countbytes:integer; // zur Positionskonrolle
readtostr:integer; // Buffer zum Lesen vom Stream
strbuffer:string; // für die Konvertierung vom Buffer ( Integer ) zum filestring ( String )
transferstr:string; // String für den endgültigen Dateitransfer

begin

streamconv:=Tfilestream.create(fn,fmopenread);
countbytes:=0;
transferstr:='';
repeat
begin

// setzen von countbytes
countbytes:=countbytes+1;
// lesen und umwandeln in string
streamconv.read(readtostr,1);
strbuffer:=inttostr(readtostr);
// formatieren
if length(strbuffer)=3 then
begin
transferstr:=transferstr+strbuffer;
strbuffer:='';
end
else
begin

if lengt(strbuffer)=2 then
begin
strbuffer:='0'+strbuffer;
transferstr:=transferstr+strbuffer;
strbuffer:='';
end;

if length(strbuffer)=1 then
begin
strbuffer:='00'+strbuffer;
transferstr:=transferstr+strbuffer;
strbuffer:='';
end;

if length(strbuffer)=0 then
begin
log.lines.add('error in file : '+fn+' @ pos : '+inttostr(countbytes));
strbuffer:='';
end;


end;

end;
until countbytes=streamconv.size;
streamconv.free;
countbytes:=0;
// verschicken
transferstr:='';



Ich wäre demjenigen , der mir ein bisschen weiterhelfen könnte wirklich sehr dankbar...
:dp:

Mfg, Lord of Ghosts :coder:

Klaus01 3. Jan 2007 20:33

Re: Byte-toString Wandler
 
Guten Abend,

mir erschließt sich noch nicht so ganz der Sinn dieser Konvertierung
(ausser das 1/3 mehr Daten übertragen werden müßen).

Auf der Übertragungsebene ist es doch egal ob Strings,Chars oder Bytes übertragen werden.
Es kommt doch nur darauf an wie die Daten auf Empfängerseite betrachtet werden müssen.

Grüße
Klaus

Lord of Ghosts 3. Jan 2007 20:47

Re: Byte-toString Wandler
 
Hallo Klaus ,

THX für die Antwort auf jeden Fall erstmal. Der Sinn dieser Konvertierung ist "simpel" (naja) :

Übertragung mit Streams funktioniert nicht , die Umsetzung einer anderen
Konvertierung war mir nicht möglich und der Quellkode des Programms ist zu groß , um ihn einfach
in Delphi2006 nochmal mit den Indies zu schreiben ( Delphi7 hab' ich nicht ) .

Deshalb musste ich auf diese seltsame Methode zurückgreifen ... schlicht mir ist nichts anderes mehr
eingefallen..

Wenn du einen anderen ( möglicherweise schnelleren )Code kennst , könntest du ihn bitte posten ( oder
ein Tutorial , dass sich mit der Übertragung von Streams auf der Basis von Delphi6-Socket-Komponenten
auseinandersetzt ) ?

THx im Voraus..
Lord of Ghosts

P.S.: Ich bin eigentlich ein ziemlicher Anfänger was das Programmieren angeht ( mach's erst seit ein
paar Jahren ,aber nicht so intensiv, und bin deshalb auch für jeglicherlei Verbesserungsvorschläge
offen..)

Daniel G 3. Jan 2007 20:51

Re: Byte-toString Wandler
 
Zitat:

Zitat von Lord of Ghosts
ich hab' das Versenden von Dateien auch schon mit
Streams ausprobiert , baer nach max. 740 KB hat die Übertragung jedesmal abgebrochen..ein paar
befreundete Programmierer meinten dazu , dass ich einfach auf Indy umsteigen soll

Joar, dann verschick' die Datei doch einfach in 700KB - Stücken, und lass Sie vom Client entsprechend zusammensetzen.... Und damit das alles nicht so lange dauert, machste halt noch 1,2 Ports zusätzlich auf... Google einfach mal in diese Richtung. Ich arbeite zwar nicht mit TClient/TServerSocket, aber wenn du sagst, ~700KB macht er mit...

Christian Seehase 3. Jan 2007 22:06

Re: Byte-toString Wandler
 
Moin Lord,

und wenn Du schon wandelst, warum dann nicht in Hex-Werte?
Dass spart dann doch Platz.

Klaus01 4. Jan 2007 07:52

Re: Byte-toString Wandler
 
Delphi-Quellcode:
repeat
begin
end;
  // setzen von countbytes
  countbytes:=countbytes+1;
  // lesen und umwandeln in string
  streamconv.read(readtostr,1);
  strbuffer:=inttostr(readtostr);
  // formatieren

  if length(strbuffer)=3 then
    begin
      transferstr:=transferstr+strbuffer;
      strbuffer:='';
    end
  else
    begin
     if lengt(strbuffer)=2 then
       begin
         strbuffer:='0'+strbuffer;
         transferstr:=transferstr+strbuffer;
         strbuffer:='';
       end;

     if length(strbuffer)=1 then
       begin
         strbuffer:='00'+strbuffer;
         transferstr:=transferstr+strbuffer;
         strbuffer:='';
       end;

     if length(strbuffer)=0 then
       begin
         log.lines.add('error in file : '+fn+' @ pos : '+inttostr(countbytes));
         strbuffer:='';
       end;
    end;

end;
until countbytes=streamconv.size;


Delphi-Quellcode:
repeat
  begin
    // setzen von countbytes
    countbytes:=countbytes+1;

    // lesen und umwandeln in string
    streamconv.read(readtostr,1);
    strbuffer:=inttostr(readtostr);
    if length(strbuffer)=0 then
       begin
         log.lines.add('error in file : '+fn+' @ pos : '+inttostr(countbytes));
         strbuffer:='';
       end
    else
      begin
        while length(strbuffer) < 3 do
          strbuffer:='0'+strbuffer;
        transferstr:=transferstr+strbuffer;
      end;
  end;
until countbytes=streamconv.size;
Nun, ob der Code schneller ist weiß ich nicht, kürzer ist er jedenfalls.

Grüße
Klaus

Lord of Ghosts 4. Jan 2007 19:04

Re: Byte-toString Wandler
 
Hallo an alle ,

Thanks für die Tipps von allen , die geschrieben haben .

@Daniel : Dass Problem ist nur : Ich weiß nicht wie man dass macht , ich bräuchte eine
"fertige" Funktion dafür , die ich einbauen kann. Hatte ich schon mal probiert :
hat nicht geklappt , ich muß mich noch ein bisschen damit auseinandersetzen , bis
ich so was kan und bis dahin bin ich dann auch auf die anderen Netzwerkkomponenten
( indy 10 oder höher ) umgestiegen , aber danke...


@Christian : Tja , ist mir bekannt , kann ich aber nicht ( was allerdings ein Problem ist ... )
d.h.: ich kann in Hex-Konvertieren aber nicht zurück...
Danke aber trotzdem !

@Klaus : Vielen ,vielen Dank für den Code , ich werde ihn mal ausprobieren und dir dann vlt. eine
Rückmeldung geben !

Mfg an alle ,

Lord of Ghosts

Christian Seehase 4. Jan 2007 22:02

Re: Byte-toString Wandler
 
Moin Lord,

Zitat:

Zitat von Lord of Ghosts
ich kann in Hex-Konvertieren aber nicht zurück...

:shock: :gruebel:

Wieso denn nicht?

Lord of Ghosts 5. Jan 2007 15:37

Re: Byte-toString Wandler
 
Weil ich die Funktion dazu nicht selbst geschrieben habe...
( zum Wandeln in Hex )

Lord of Ghosts

shmia 5. Jan 2007 16:00

Re: Byte-toString Wandler
 
Zitat:

Zitat von Lord of Ghosts
d.h.: ich kann in Hex-Konvertieren aber nicht zurück...

Armer Bub ( :spin: ), kuck mal hier:
http://www.delphipraxis.net/internal...ct.php?t=46356


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz