![]() |
FileStream von Byte x bis Byte y lesen und als String ausgeben.
Hello Freunde,
kann bitte mir jemand behilflich sein um wie folgt in DELPHI-XE7 zu schreiben: - Ein File (Test.dat) als FileStream öffnen und aus Stream Bytenummer 33, 34, 35 und 36 (also Bytes 33-36) als String zu gegebene Variable zuweisen.Die Bytes können auch nicht druckbare chars sein. Sowas habe ich in Visual Basic-6 wie folgt realiziert aber in Delphi kriege ich leider nicht hin: VB6 Code: Private Sub Command1_Click() Dim FSO As Object Dim FilePath As String Dim StreamFile As TextStream Dim strText As String Dim idxLength As Long Set FSO = CreateObject("Scripting.FileSystemObject") FilePath = App.Path & IIf(Right$(App.Path, 1) <> "\", "\", "") & "Test.dat" If FSO.FileExists(FilePath) Then Set FileName = FSO.GetFile(FilePath) End If Set StreamFile = FileName.OpenAsTextStream(ForReading, TristateUseDefault) strText = StreamFile.Read(36) ' // *************Read 36 bytes Label1.Caption = ConvertIt(Right$(strText, 4)) ' // *************Read 33,34,35,36th byte StreamFile.Close Set StreamFile = Nothing Set FSO = Nothing End Sub __________________________________________________ ______________________________________________ Problem habe ich in DELPHI hier : strText = StreamFile.Read(36) ' // *************Read 36 bytes Label1.Caption = ConvertIt(Right$(strText, 4)) ' // *************Read 33,34,35,36th byte Thanx im Voraus :-):) |
AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
In
Delphi-Quellcode:
hast du z.B.
System.IoUtils
Delphi-Quellcode:
, das gibt einen
TFile.Open(..)
Delphi-Quellcode:
zurück.
TFileStream
Und: Bist du sicher dass die die "rohen" Bytes wirklich in einen String stopfen willst? Ein String ist kein Container für Bytes, sondern Text. Wenn du wirklich die echten Bytes willst, dann nimm ein Array. Hier jedenfalls ein Beispiel das die Bytes als ASCII interpretiert und dann in den String steckt.
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes, System.IoUtils; const filePath = 'x:\myFile.dat'; startByte = 33; byteCount = 4; // 33, 34, 35, 36 var fileStream: TStream; myBytes: TBytes; myString: String; begin fileStream := TFile.Open(filePath, TFileMode.fmOpen); try if fileStream.Seek(startByte, TSeekOrigin.soBeginning) < startByte then raise Exception.Create('file is too small'); if fileStream.Read(myBytes, byteCount) < byteCount then raise Exception.Create('file is too small'); myString := TEncoding.ASCII.GetString(myBytes); finally fileStream.Destroy(); end; end. |
AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Die Implementierung in mein Windows VCL Application (Nicht Konsole) gibt leider die Meldung "File is too small" zurück meine Implementierung: procedure TForm1.Button2Click(Sender: TObject); const filePath = 'C:\Test.dat'; startByte = 33; byteCount = 4; // 33, 34, 35, 36 var fileStream: TFileStream; myBytes: TBytes; myString: String; begin fileStream := TFileStream.Create(filepath, fmOpenRead); try if fileStream.Seek(startByte, TSeekOrigin.soBeginning) < startByte then raise Exception.Create('file is too small'); if fileStream.Read(myBytes, byteCount) < byteCount then raise Exception.Create('file is too small'); myString := TEncoding.ASCII.GetString(myBytes); finally fileStream.Destroy(); end; ShowMessage (myString); end; Test.dat als Zip Anhang |
AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
Ja, ein Fehler ist drin: Ich dachte bei
Delphi-Quellcode:
würde er die Größe des Arrays
fileStream.Read(..)
Delphi-Quellcode:
selbst anpassen. Falsch gedacht, man muss sie vorher selbst groß genug machen.
myBytes
Der Aufruf muss also lauten
Delphi-Quellcode:
Als ASCII-String wären diese 4 Bytes aus deiner Test-Datei also zwei Nullzeichenn, gefolgt von "0W"
SetLength(myBytes, byteCount);
if fileStream.Read(myBytes, byteCount) < byteCount then raise Exception.Create('file is too small'); |
AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
..versuche es mal so:
Delphi-Quellcode:
Grüße
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes, System.IoUtils; const filePath = 'u:\Test.dat'; startByte = 33; byteCount = 4; // 33, 34, 35, 36 var fileStream: TStream; myBytes: Array[0..byteCount -1] of Byte; myString: String; bytesRead: Integer; begin fileStream := TFile.Open(filePath, TFileMode.fmOpen); try if fileStream.Seek(startByte, TSeekOrigin.soBeginning) < startByte then raise Exception.Create('file is too small'); if fileStream.Read(myBytes, byteCount) < byteCount then raise Exception.Create('file is too small'); myString := TEncoding.ASCII.GetString(myBytes); finally fileStream.Destroy(); end; end. Klaus |
AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
Dear Klaus,
Dear Günther, Vieeeelen lieeeeeben Dank. Es klappt nun wunderbar :) VG aus FFM |
AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
Es gibt aber einen Problem und zwar so gelesene ASCII String
myString := TEncoding.ASCII.GetString(myBytes); mit der Funktion : Function RunConv(const S: string): LongInt ; var i: Integer; begin Result := 0; for i := 1 to Length(S) do Inc(Result, Ord(S[i]) shl ((32 - 8*i))) end; (unter Verwendung // RunConv(myString); bearbeite dann bekomme ich manschmal fehlerhafte Ergebnis und zwar um (-128) hat es mit int8 oder Uint8 etwas zu tun ? (Sorry for my bad Deutsch) |
AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
Ob irgendwo falsch gerechnet wird, das sagt dir dein Debugger.
PS: Es sind nicht zufällig mehr als 3 Zeichen in de String?
Delphi-Quellcode:
mit 1 bis Length, also mit viel Spaß ab 4.
shl ((32 - 8*i))
|
AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
Fehler lag bei TEncoding -> es musste ANSI sein
myString := TEncoding.ANSI.GetString(myBytes); Thanks Friends for your kind help :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz