Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Daten-String in Array of Byte einlesen (https://www.delphipraxis.net/201588-daten-string-array-byte-einlesen.html)

DonPedroFo 5. Aug 2019 09:03

Delphi-Version: 5

Daten-String in Array of Byte einlesen
 
Hallo,
ich hoffe ich drück mich richtig aus und verwechsel keine Fachbegriffe.

Ich habe die Aufgabe, aus einer Text Datei mehrere Daten-Strings in ein Array of Byte "einzulesen"

ein "Datenstring" besteht aus 64 Byte und sieht z.b. folgender maßen aus: 12450ABF43ED234DFAB39104365FFF221943AABEE04365FFF2 21943AABEEBEE04365FFF221

ich hab schon folgendes probiert aber komme irgendwie auf keinen grünen Zweig:


1. Versuch

var
i : Integer;
sZeile : String;
Daten : Array of Byte;
.
begin
SL := TStringlist.Create;
SL.LoadfromFile('.....');

for i := 0 to sl.Count-1 do begin
sZeile := SL.Strings[i];
Daten[i] := StrToInt ('$'+sZeile);
end;
.
.
.
.

hier bekomme ich immer die Datei '12450ABF43ED234DFAB39104365FFF221943AABEE04365FFF 221943AABEEBEE04365FFF221' ist kein gütliger Integerwert ist. (egal ob ich mit oder ohne '$' schreib).

DieDolly 5. Aug 2019 09:06

AW: Daten-String in Array of Byte einlesen
 
Steht der String so in der Textdatei?
Denn was du machst ist die Datei Zeile für Zeile auslesen und nicht Zeichen für Zeichen.

Und wenn du schonmal dabei bist Delphi zu lernen dann gewöhn dir diesen unsäglichen C-Stil ab und schieb das begin in die nächste Zeile.

Aviator 5. Aug 2019 09:08

AW: Daten-String in Array of Byte einlesen
 
Ich weiß nicht ob es nur ein Formatierungsfehler hier im Forum ist, aber bei beiden Zeichenketten sehe ich ca. in der Mitt ein Leerzeichen. Das sollte da natürlich nicht sein. Am besten verwendest du noch
Delphi-Quellcode:
Trim()
bevor du die Zeichenkette an die
Delphi-Quellcode:
StrToInt()
Funktion übergibst.

Edit: Ich sehe gerade, dass du ein array of Byte verwendest. Dann wäre das Umwandeln der Zeichenkette natürlich unnötig. Zudem ist dieser Hex-Wert selbst für einen Int64 noch zu groß.

Der schöne Günther 5. Aug 2019 09:16

AW: Daten-String in Array of Byte einlesen
 
Zitat:

Zitat von DieDolly (Beitrag 1439434)
Denn was du machst ist die Datei Zeile für Zeile auslesen und nicht Zeichen für Zeichen.

Etwas genauer erklärt: Eine TStringList liest den Text aus einer Datei zeilenweise ein. Wenn du auf das x-te Element zugreifst, dann nimmst du die x-te Zeile. Wenn du also eine Datei mit mehreren Zeilen hast brauchst du auch zwei for-Schleifen: Eine für jede Zeile und eine für das jeweilige Zeichen darin.


Zitat:

Zitat von DieDolly (Beitrag 1439434)
dann gewöhn dir diesen unsäglichen C-Stil ab und schieb das begin in die nächste Zeile.

dafuq 🤪

DonPedroFo 5. Aug 2019 09:34

AW: Daten-String in Array of Byte einlesen
 
@Die Dolly, ursprünglich ist das ganze ein S-Record File von Motorola. Aber Imprinzip ist es nichts anders als eine Textdatei, bei der "x"-Zeile untereinander stehen mit einem jeweiligen HEX-Code.
Sinn des ganzen wäre es diesen "Daten-String" in ein Array of Byte zu schreiben, da ich diese Daten Byte für Byte in ein Flash schreiben muss.
Das mit dem beginn werde ich mir angewöhnen ;D
@Aviator: Das Leerzeichen müsste ein Formatierungsfehler sein. In meiner Datei steht kein Leerzeichen.

@Günther: So ist der Plan in meinem Kopf; ich lese das gesamte "Dokument" Zeile für Zeile ein, und "schiebe" jede Zeile in ein Array of Byte mit dem ich wieder weiterarbeiten kann.

DieDolly 5. Aug 2019 09:39

AW: Daten-String in Array of Byte einlesen
 
Zitat:

@Die Dolly, ursprünglich ist das ganze ein S-Record File von Motorola. Aber Imprinzip ist es nichts anders als eine Textdatei, bei der "x"-Zeile untereinander stehen mit einem jeweiligen HEX-Code.
Dann ließt du die Daten falsch ein so wie ich sagte.

DonPedroFo 5. Aug 2019 09:48

AW: Daten-String in Array of Byte einlesen
 
ich sag mal so,
Im Moment lese ich die Daten in eine Stringliste ein und arbeite damit weiter. Das funktioniert auch ohne großen Probleme.

DieDolly 5. Aug 2019 09:50

AW: Daten-String in Array of Byte einlesen
 
Wenn das ohne Probleme funktionieren würde, hättest du nicht hier um Hilfe gebeten :P

DonPedroFo 5. Aug 2019 09:57

AW: Daten-String in Array of Byte einlesen
 
Wenn ich die Daten in eine Stringliste schreibe und mit dieser dann weiter arbeite funktioniert es.
Allerdings sind dann die Daten in einem "String".

Wenn ich die Daten in eine Stringliste schreibe und die einzelnen Zeilen in ein Array of Byte packe funktioniert es nicht.

Und deswegen versuche ich auch viel erstmal selbst zu lösen. Aber bis jetzt bin ich auf keinen grünen Zweig gekommen.

Deswegen stell ich die Frage an was es liegen könnte.

Ich hab auch schon die Firma Google gefragt und auch hier im Forum die Suchfunktion benutzt.

Bisher ohne Erfolg.

DieDolly 5. Aug 2019 10:00

AW: Daten-String in Array of Byte einlesen
 
Zitat:

Ich hab auch schon die Firma Google gefragt. Bisher ohne Erfolg.
Das wird auch so bleiben. Bei denen etwas nachzufragen ist sinnlos.

DeddyH 5. Aug 2019 10:02

AW: Daten-String in Array of Byte einlesen
 
Nur dass ich das richtig verstanden habe, aus dem String '12450A' soll ein Array of Byte mit dem Inhalt (18, 69, 10) werden, stimmt das (ich weiß, Deine Strings sind länger, aber ich war zu faul)?

Redeemer 5. Aug 2019 10:35

AW: Daten-String in Array of Byte einlesen
 
Wenn du den Stream von Hex entschlüsseln sollst: StrToInt('xA3') als Ansatz.

Wenn du den Stream unverändert ausgeben möchtest: Delphi-Referenz durchsuchenTStringStream oder Delphi-Referenz durchsuchenTBytesStream. Die haben ein array of Byte als Eigenschaft (Bytes glaube ich).

Der schöne Günther 5. Aug 2019 10:51

AW: Daten-String in Array of Byte einlesen
 
TFile.ReadAllBytes(..) 😶

Schokohase 5. Aug 2019 11:02

AW: Daten-String in Array of Byte einlesen
 
Also wenn du diesen String (mit Hex-Werten) in Bytes umwandeln möchtest, dann geht das so
Delphi-Quellcode:
function DecodeHexStringToBytes(const AHexString: string): TBytes;
var
  byteIdx: Integer;
  Len: Integer;
begin
  Len := AHexString.Length;
  if AHexString.Length mod 2 <> 0 then
    raise EArgumentException.Create('AHexString must contain even number of chars');

  SetLength(Result, AHexString.Length div 2);
  for byteIdx := 0 to AHexString.Length div 2 - 1 do
  begin
    Result[byteIdx] := Byte.Parse('$' + AHexString.Substring(byteIdx * 2, 2));
  end;
end;
Hier werden immer zwei Hexadezimal-Ziffern genommen und davon der Dezimal-Wert berechnet und dieser in dem Byte-Array gespeichert.

BTW Dein Beispiel-String aus dem ersten Post beinhaltet 74 Zeichen und das ergibt dann 37 Bytes.

DonPedroFo 5. Aug 2019 11:48

AW: Daten-String in Array of Byte einlesen
 
@DeddyH: ja so sollte es am ende aussehen

@Günther: Tfile.ReadAllBytes(...) schreib ich dann in den Klammern den Pfad, in dem das File liegt?

@Schockohase: Danke für den Code, ich probier ihn mal aus.

Der schöne Günther 5. Aug 2019 12:10

AW: Daten-String in Array of Byte einlesen
 
Schaust du Doku

peterbelow 5. Aug 2019 12:26

AW: Daten-String in Array of Byte einlesen
 
Zitat:

Zitat von DonPedroFo (Beitrag 1439433)
Hallo,
ich hoffe ich drück mich richtig aus und verwechsel keine Fachbegriffe.

Ich habe die Aufgabe, aus einer Text Datei mehrere Daten-Strings in ein Array of Byte "einzulesen"

ein "Datenstring" besteht aus 64 Byte und sieht z.b. folgender maßen aus: 12450ABF43ED234DFAB39104365FFF221943AABEE04365FFF2 21943AABEEBEE04365FFF221

ich hab schon folgendes probiert aber komme irgendwie auf keinen grünen Zweig:

Du (und bisher alle Antwortenden) machst das viel zu kompliziert. Delphi hat eine Funktion HexToBin (in system.classes), die exakt das macht, was Du haben willst.

Schokohase 5. Aug 2019 12:31

AW: Daten-String in Array of Byte einlesen
 
Zitat:

Zitat von peterbelow (Beitrag 1439494)
Du (und bisher alle Antwortenden) machst das viel zu kompliziert. Delphi hat eine Funktion HexToBin (in system.classes), die exakt das macht, was Du haben willst.

Ja, aber: Not invented here!

(Natürlich hast du Recht)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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