Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   FileStream von Byte x bis Byte y lesen und als String ausgeben. (https://www.delphipraxis.net/206127-filestream-von-byte-x-bis-byte-y-lesen-und-als-string-ausgeben.html)

Gandimann 20. Nov 2020 18:55

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 :-):)

Der schöne Günther 20. Nov 2020 19:31

AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
 
In
Delphi-Quellcode:
System.IoUtils
hast du z.B.
Delphi-Quellcode:
TFile.Open(..)
, das gibt einen
Delphi-Quellcode:
TFileStream
zurück.

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.

Gandimann 20. Nov 2020 20:29

AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Der schöne Günther (Beitrag 1477666)
In
Delphi-Quellcode:
System.IoUtils
hast du z.B.
Delphi-Quellcode:
TFile.Open(..)
, das gibt einen
Delphi-Quellcode:
TFileStream
zurück.

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.

Danke Günther für deine Rückmeldung.

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

Der schöne Günther 20. Nov 2020 20:45

AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
 
Ja, ein Fehler ist drin: Ich dachte bei
Delphi-Quellcode:
fileStream.Read(..)
würde er die Größe des Arrays
Delphi-Quellcode:
myBytes
selbst anpassen. Falsch gedacht, man muss sie vorher selbst groß genug machen.

Der Aufruf muss also lauten
Delphi-Quellcode:
     SetLength(myBytes, byteCount);
     if fileStream.Read(myBytes, byteCount) < byteCount then
       raise Exception.Create('file is too small');
Als ASCII-String wären diese 4 Bytes aus deiner Test-Datei also zwei Nullzeichenn, gefolgt von "0W"

Klaus01 20. Nov 2020 20:58

AW: FileStream von Byte x bis Byte y lesen und als String ausgeben.
 
..versuche es mal so:
Delphi-Quellcode:
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.
Grüße
Klaus

Gandimann 20. Nov 2020 21:44

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

Gandimann 21. Nov 2020 15:51

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)

himitsu 22. Nov 2020 07:02

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:
shl ((32 - 8*i))
mit 1 bis Length, also mit viel Spaß ab 4.

Gandimann 25. Nov 2020 22:50

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 01:54 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