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: |
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 |
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..) |
Re: Byte-toString Wandler
Zitat:
|
Re: Byte-toString Wandler
Moin Lord,
und wenn Du schon wandelst, warum dann nicht in Hex-Werte? Dass spart dann doch Platz. |
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:
Nun, ob der Code schneller ist weiß ich nicht, kürzer ist er jedenfalls.
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; Grüße Klaus |
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 |
Re: Byte-toString Wandler
Moin Lord,
Zitat:
Wieso denn nicht? |
Re: Byte-toString Wandler
Weil ich die Funktion dazu nicht selbst geschrieben habe...
( zum Wandeln in Hex ) Lord of Ghosts |
Re: Byte-toString Wandler
Zitat:
http://www.delphipraxis.net/internal...ct.php?t=46356 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 Uhr. |
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