Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Array of Bytes dynamisch erstellen (https://www.delphipraxis.net/206219-array-bytes-dynamisch-erstellen.html)

Gandimann 30. Nov 2020 22:09

Array of Bytes dynamisch erstellen
 
Hallo Friends,
besteht die Möglichkeit, dass ich:

myBytes: Array[0..byteCount -1] of Byte; dynamisch umwandeln kann ungefähr so myBytes: Array[x..y] of Byte; (wo x und y als Integer Variable werden ?


Bis jetzt habe ich wie folgt benutzt:

selectedFile := lblFilePath.Caption ;

fileStream := TFile.Open(selectedFile, 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.ANSI .GetString(myBytes);
finally
fileStream.Destroy();
end;

Thanks and have a great Time :)

himitsu 30. Nov 2020 22:22

AW: Array of Bytes dynamisch erstellen
 
Nein, da
Delphi-Quellcode:
Array[x..y] of irgendwas
ein statisches Array ist, welches bereits der Compiler so lang macht, bevor dein Programm überjaupt läuft.
x und y können dürfen nur Konstanten sein.

Aber bei einem dynamischen Array ala
Delphi-Quellcode:
array of irgendwas
TArray<irgendwas> // die Variante von "array of irgendwas" mit Generics (seit Delphi2009)
TBytes // was ein "eigener" Typ ähnlich "array of Byte" ist
...
da kann man zur Laufzeit mit SetLength arbeiten.

Dynamische Arrays fangen aber immer bei 0 an.

Es bliebe noch das viariante Array, also Typ Variant in dem ein Array reingepackt wird,
oder eine Klasse mit Array-Property, wo du selbst den Index des Property z.B. auf den Index einer dynamischen Array-Variable abbildest.



Zitat:

TEncoding.ASCII.GetString(myBytes); -----> myBytes muss ich durch variabeln anpassen können.
Hättest du mal nachgesehn, was GetString für einen Parameter haben möchte, und schon hättest du auch gewusst, welchen Typen deine Variable myBytes benötigt. :zwinker:

Gandimann 30. Nov 2020 22:36

AW: Array of Bytes dynamisch erstellen
 
Danke für die Hilfe :
meinst du so :

var
v: array of byte;
i,j:integer;
begin
j := 1000;
setlength(v, j);
for i:=40 to j do
begin
myString := TEncoding.ANSI .GetString(v);
end;

end;

Leider funktioniert nicht........

Need Help.... please !!!!!!!!!!!

Klaus01 1. Dez 2020 06:17

AW: Array of Bytes dynamisch erstellen
 
Delphi-Quellcode:
for i:=40 to j- 1 do
begin
myString := TEncoding.ANSI .GetString(v);
end;
dynamische Array beginnen bei 0
Enden dann bei Anzahl der Elemente -1

Grüße
Klaus

Andreas13 1. Dez 2020 08:58

AW: Array of Bytes dynamisch erstellen
 
Wenn Du Dir die Schreibweise
Delphi-Quellcode:
For i:= Low(IregendEinArrray) To High(IregendEinArrray) Do
Begin
… 
End;
angewöhnst, dann kannst Du nichts falsch machen. Low(..) und High(..) funktioniert sowohl bei dynamischen, wie auch bei statischen Arrays.
Gruß, Andreas

Mavarik 1. Dez 2020 09:15

AW: Array of Bytes dynamisch erstellen
 
Zitat:

Zitat von Gandimann (Beitrag 1478270)

Delphi-Quellcode:
var
  v: array of byte;
  i,j:integer;
begin
  j := 1000;
  setlength(v, j);
  for i:=40 to j do
  begin
        myString := TEncoding.ANSI .GetString(v);
  end;

end;
Leider funktioniert nicht........

Need Help.... please !!!!!!!!!!!

Emm... :stupid:
Ein Buffer mit 1000 Bytes.. OK
und dann 960x ab dem 1. byte den gleichen String lesen?

Was versucht Du zu erreichen?

Mavarik :coder:

Gandimann 1. Dez 2020 14:33

AW: Array of Bytes dynamisch erstellen
 
Hallo Mavarik,
ich möchte gern ein Binär Datei Blockweise ( z.B erster Block von 22ten Byte bis 200ten Byte und nächster Block zwichen 220 - 816ten Bytes usw..) splitten und in einen DB (Firebird) abspeichern und später je nach Bedarf die ausgewählte Blöcke wieder zusammen in eine Binär Datei schreiben. Die Start-und- Endbytes der Blöcke werden vorher aus Binär gerechnet
Alles habe ich bereits im Jahr 2001 in Visual Basic 6 und MDB Datenbank realisiert. Quellcode kann ich zur Verfügung stellen.

Delphi für mich relativ neu ist daher habe ich Probleme..... :-(

Mavarik 2. Dez 2020 23:29

AW: Array of Bytes dynamisch erstellen
 
Zitat:

Zitat von Gandimann (Beitrag 1478323)
Hallo Mavarik,
ich möchte gern ein Binär Datei Blockweise ( z.B erster Block von 22ten Byte bis 200ten Byte und nächster Block zwichen 220 - 816ten Bytes usw..) splitten und in einen DB (Firebird) abspeichern und später je nach Bedarf die ausgewählte Blöcke wieder zusammen in eine Binär Datei schreiben. Die Start-und- Endbytes der Blöcke werden vorher aus Binär gerechnet
Alles habe ich bereits im Jahr 2001 in Visual Basic 6 und MDB Datenbank realisiert. Quellcode kann ich zur Verfügung stellen.

Delphi für mich relativ neu ist daher habe ich Probleme..... :-(

OK...

Also abgesehen davon, dass ich das in einem Blobfeld dann speichern würde... Ich gehe davon aus, dass es sich bei den Bin-Daten um Strings handelt?
Also Du hast also fixe Start-Positionen und fixe Längen vorberechnet?
Nach dem Motto... Start 22 Len 188 Start 220 Länge x...

Also sagen wir mal Du hat einen Record:

Delphi-Quellcode:
Type
 Parts = Record
           Start : Integer;
           Len  : Integer;
         end;

 PartsList : TArray<Parts>; // oder mit altem Delphi Array of Parts;


var
  MS : TMemoryStream;
  S : AnsiString;
  i : Integer;
begin
  FillPartsList(PartsList);

  MS := TMemoryStream.Create;
  try
    MS.LoadFromFile('Bindaten.Dat');

    for i:=0 to high(PartsList) do
      begin
        Setlength(S,PartList[i].Len);
        MS.Position := PartsList[i].Start;
        Move(MS.Memory^,S[1],PartList[i].Len);
        WriteToFirebird(S);    
      end;

  finally
    MS.Free;
  end;
end.
So zum Beispiel...

Eine von unzähligen Möglichkeiten...

Mavarik :coder:

Gandimann 3. Dez 2020 23:26

AW: Array of Bytes dynamisch erstellen
 
Das nenne ich Hife von feinsten.........

Mit FileStream Position bin auch weiter gekommen aber deine Lösung ist vieeeeel besser.

Danke Mavarik for your kind help


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