Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Integers, Strings, booleans in BinärDaten converertieren (https://www.delphipraxis.net/106663-integers-strings-booleans-binaerdaten-converertieren.html)

snow 14. Jan 2008 19:03


Integers, Strings, booleans in BinärDaten converertieren
 
Hallo

ich arbeite an folgendem

Ich habe einen typ Deklariert

Delphi-Quellcode:
Type TBinaryObject = array of byte;
dieser besteht nur aus bytes.

ich will nun ein paar convertierungsfunctionen schreiben. Ich dachte an integers, strings(auch dynamische), booleans und Gleitkommazahlen.

nun meine Frage:

Wie kann ich z.b die 4 bytes aus einem integer wert auslesen?

Wie geht das bei dynamischen Strings? da habe ich ja nur einen Zeiger.

gruß snow

PS:// geht das ohne Tstream oder einen Nachfahren von TStream zu verwenden?

mkinzler 14. Jan 2008 19:08

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Zitat:

Wie kann ich z.b die 4 bytes aus einem integer wert auslesen?
Betrachte den speicher eines Intewgers als einen Bytearray oder zerlege mit DIV
Chars sind ja Bytes also sind Strings kein Problem

Dax 14. Jan 2008 19:09

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Es gibt da eine Prozedur namens Move:
Delphi-Quellcode:
procedure Move(const source; const dest; count: Integer);
Damit kannst du beliebige Daten durch die Gegend kopieren, zum Beispiel einen Int-Wert in ein Byte-Array:
Delphi-Quellcode:
Move(intWert, byteArray[offset], sizeof(integer));

Apollonius 14. Jan 2008 19:10

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Natürlich geht das ohne TStream. Und für Wertetypen und statische Arrays, also alles, was kein Zeiger ist, ist das auch ganz einfach:
Delphi-Quellcode:
var IntVar: Integer; Bytes: TBinaryObject;
begin
SetLength(Bytes, SizeOf(IntVar));
Move(IntVar, Bytes[0]);
end;
Und das war es auch schon. Das ist absolut keine Hexerei.
Zitat:

dieser besteht nur aus bytes.
Alles besteht aus Bytes. Du musst dir vor Augen halten, dass alles nur eine Bytefolge ist. Alles andere ist Interpretation! Im Prinzip kannst du dir deine Konvertierungsfunktionen also schenken. Für Strings und dynamische Array funktioniert es genauso wie für Wertetypen, du musst bei Move eben immer das erste Byte als ersten Parameter angeben (bei Strings z.B. s[1]) und bei SetLength die richtige Größe angeben (nicht die mit SizeOf erhaltene).

snow 14. Jan 2008 19:18

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Es ist aber schon schöner, wenn man dem programm nur einen integer wert übergibt, und der rest dann automatisch gemacht wird.

Wie heißt den die gegenprocedure zu Move?
Oder kann ich das array auslesen und in den integer schreiben?

gruß snow

wicht 14. Jan 2008 19:20

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Zitat:

Oder kann ich das array auslesen und in den integer schreiben?
Richtig.

Apollonius 14. Jan 2008 19:22

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Move ist Move und fertig Ende. Move bewegt einen Speicherblock, von wo do willst wohin du willst. Also exakt das selbe mit umgedrehten Parametern zum Auselesen.
Und deine Funktion kannst du für Wertetypen so gestalten, dass du als zweiten Parameter die Größe übergibst. Da wünscht man sich schon fast Makros wie in C.

snow 14. Jan 2008 19:49

Re: Integers, Strings, booleans in BinärDaten converertieren
 
um mir ein wenig arbeit zu ersparen hab ich anstatt integer mal ordinal genommen.

Sollte ja auch funktionieren, aber wenn ich eine funktion deklariere mit Ordinal dann...

Delphi-Quellcode:
function InttoBin(ord : ordinal):TBinaryObject;
Zitat:

[Fehler] JTBinaryConvert.pas(9): E2003 Undefinierter Bezeichner: 'ordinal'
woran liegts?

gruß snow

Apollonius 14. Jan 2008 19:50

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Den Typ Ordinal gibt es nicht. Er ist nur ein Hilfstyp bei einigen Funktionen, die bereits vom Compiler umgesetzt werden.

snow 14. Jan 2008 19:53

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Ich kann also keiner function einen parameter vom typ ordinal übergeben?

und wie macht dass dann inc(X : Ordinal);

gruß snow

Apollonius 14. Jan 2008 19:56

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Das habe ich doch geschrieben: Inc wird vom Compiler umgesetzt. Wenn du dir die CPU-Ansicht anschaust, siehst du, dass keine Funktion Inc aufgerufen wird.

snow 14. Jan 2008 20:13

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Und wie kann ich dann einen integer wert übergeben wenn ich noch nicht seine breite weis?

es macht ja schon einen unterschied ob ich ein Byte oder 4 byte speicher benutze.

Delphi muss doch Enumeric-Typ auch als übergabeparameter akzeptieren.
wenn ich so was hier mache:

Delphi-Quellcode:
 function InttoBin(var Int):TBinaryObject;
begin
SetLength(Result, SizeOf(Int));
Move(Int, result[0], sizeof(Int));
end;
dann sollte ja Int von jedem typ möglich sein.

Aber egal welchern typ ich verwende es kommt beim sizeof(int) Null raus. dabei soll var doch im gegensatz zu Int : integer die direkte variable weitergeben, sodass änderungen von int auch änderungen von der int zugewiesenen Variable hervorrufen.
In meinem Fall wäre auch const interressant aber da kommt auch immer null raus.

gruß snow

mkinzler 14. Jan 2008 20:18

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Eigentlich müsste hier immer 4 rauskommen, da es sich um einen Zeiger handelt. Warum Var?

snow 14. Jan 2008 20:46

Re: Integers, Strings, booleans in BinärDaten converertieren
 
es kommt aber immer Null(mat = 0) raus.

kannst ja mal die function mit nem byte aufrufen. oder mit nem double oder mit ner integer.

egal was kommt. Der PC schpuckt die Null raus.

es muss doch auch ne möglichkeit geben eine integer variable mit dem typ zu übergeben in dem si ist ohne überladen. Der PC weis doch obs nun ein byte ist. dann kann er doch auch die variable auf nen byte anpassen, oder ist delphi nicht so toll wie lange angenommen?

auch ordinäre Typen muss man übergeben können.

Delphi-Quellcode:
function InttoBin(var Int):TBinaryObject;
Wenn ich es so übergebe muss ich doch unterscheiden können von welchem typ meine variable ist.

gruß snow

mkinzler 14. Jan 2008 20:50

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Wie soll das ohne Angabe von einem Typ gehen?

SirThornberry 14. Jan 2008 20:54

Re: Integers, Strings, booleans in BinärDaten converertieren
 
@snow: Bei deinen Vorhaben der letzten Zeit würde ich dir empfehlen über Delphi hinaus zu schauen und dir einfach mal die Grundlagen der Informatik genau zu betrachten. Also nicht irgendwelche Programmiersprachen sondern bitweises rechnen, machienenbefehle etc. So das du weißt was im Rechner eigentlich passiert wenn du einen simplen Delphi befehl nutzt. Wie bereits erwähnt ist Speicher einfach Speicher der in Bits und Bytes vorliegt. Ob du diese Bits als String, Pointer, Integer, Extended etc. interpretierst ist eine Darstellungssache. Und um das zu begreifen ist es glaub ich das beste du weißt was eigentlich im Rechner passiert (und nicht nur was auf dem Bildschirm zu sehen ist oder per Programmiersprache zusammengetippt werden kann)

snow 14. Jan 2008 20:56

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Wenn ich ein byte an eine function mit einem integer-parameter übergebe, dann soll der nicht das byte in einen integer(32) konvertieren sondern als byte belassen und die function durchführen.

genauso bei allen anderen integer-untertypen.

am besten wäre sowiso eine routine die einen ordinären typ annimmt und dann seine größe bestimmt(via sizeof) und dann das ganze via move ins array läd.

gruß snow

mkinzler 14. Jan 2008 21:00

Re: Integers, Strings, booleans in BinärDaten converertieren
 
SizeOf() liefert dir aber nur den Speicherplatz der die Variable belegt = maximaler Wertebereich.
Du könntest überladene Funktionen nehmen

Apollonius 14. Jan 2008 21:07

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Delphi-Quellcode:
procedure WasAuchImmer(const Variable; Size: Cardinal);
Anders geht es nicht. Punkt aus. Du kannst innerhalb der Routine nicht mehr feststellen wie groß die Variable ist, weil diese Information nicht übergeben wird. Also übergib diese Information per Hand. Oder du überlädtst dich tot.

snow 14. Jan 2008 21:12

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Zitat:

SizeOf() liefert dir aber nur den Speicherplatz der die Variable belegt = maximaler Wertebereich.
Du könntest überladene Funktionen nehmen
ja das würde mir ja reichen aber...

Delphi-Quellcode:
function InttoBin(X : integer):TBinaryObject;
begin
SetLength(Result, SizeOf(X));
Move(X, result[0], sizeof(X));
end;
wenn ich diese function mit dieser routine hier aufrufe....

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var int : byte;
bin : TBinaryObject;
begin
int:=244;
bin:=inttobin(int);
end;
dann hab ich als sizeof(X) immer 4, weil das byte voher in einen integer32 umgewandelt wird. Dabei gehen 3 bytes lehr aus. Obwohl der programmer ja eigendelich int schon als byte deklariert hat.

Der programmer nimmt also an, dass int maximal 255 groß wird. Warum also immer 4 Bytes verwenden.

gruß snow

PS:// das mag so klingen als ob ich bei programmen bytes zählen würde. Zwar macht es bei Gbyte-Festplatten nix aus ob jetz 4 oder 1 Byte benutz wird, aber wie heisst es so schön: Die Menge machts. Oder : Wer den Pennig/Cent nicht ehrt dem ist auch die D-mark/Euro nix wert.

Apollonius 14. Jan 2008 21:14

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Du musst generisch werden, wie in meiner Variante. Alles andere wird nichts. Du musst dir einfach überlegen, welche Information die Funktion überhaupt mitbekommt. Und wenn du einen statischen Typ übergibst, geht eben die Größeninformation verloren. Die musst du also von Hand übergeben.

mkinzler 14. Jan 2008 21:55

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Du bist wirklich dickköpfig. Es wurde dir jetzt schon diverse Mal gesagt, das SizeOf dich auf den Holzweg führt. A ber vielleicht sind wir hier alle Idioten :wall:

sirius 14. Jan 2008 22:32

Re: Integers, Strings, booleans in BinärDaten converertieren
 
Was ist denn mit variant? Da wird ja praktischerweise der Typ mitgespeichert. Und man kann nachher wieder alles auseinanderbasteln.


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