![]() |
Integers, Strings, booleans in BinärDaten converertieren
Hallo
ich arbeite an folgendem Ich habe einen typ Deklariert
Delphi-Quellcode:
dieser besteht nur aus bytes.
Type TBinaryObject = array of byte;
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? |
Re: Integers, Strings, booleans in BinärDaten converertieren
Zitat:
Chars sind ja Bytes also sind Strings kein Problem |
Re: Integers, Strings, booleans in BinärDaten converertieren
Es gibt da eine Prozedur namens Move:
Delphi-Quellcode:
Damit kannst du beliebige Daten durch die Gegend kopieren, zum Beispiel einen Int-Wert in ein Byte-Array:
procedure Move(const source; const dest; count: Integer);
Delphi-Quellcode:
Move(intWert, byteArray[offset], sizeof(integer));
|
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:
Und das war es auch schon. Das ist absolut keine Hexerei.
var IntVar: Integer; Bytes: TBinaryObject;
begin SetLength(Bytes, SizeOf(IntVar)); Move(IntVar, Bytes[0]); end; Zitat:
|
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 |
Re: Integers, Strings, booleans in BinärDaten converertieren
Zitat:
|
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. |
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:
gruß snow |
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.
|
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 |
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.
|
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:
dann sollte ja Int von jedem typ möglich sein.
function InttoBin(var Int):TBinaryObject;
begin SetLength(Result, SizeOf(Int)); Move(Int, result[0], sizeof(Int)); end; 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 |
Re: Integers, Strings, booleans in BinärDaten converertieren
Eigentlich müsste hier immer 4 rauskommen, da es sich um einen Zeiger handelt. Warum Var?
|
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:
Wenn ich es so übergebe muss ich doch unterscheiden können von welchem typ meine variable ist.
function InttoBin(var Int):TBinaryObject;
gruß snow |
Re: Integers, Strings, booleans in BinärDaten converertieren
Wie soll das ohne Angabe von einem Typ gehen?
|
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)
|
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 |
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 |
Re: Integers, Strings, booleans in BinärDaten converertieren
Delphi-Quellcode:
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.
procedure WasAuchImmer(const Variable; Size: Cardinal);
|
Re: Integers, Strings, booleans in BinärDaten converertieren
Zitat:
Delphi-Quellcode:
wenn ich diese function mit dieser routine hier aufrufe....
function InttoBin(X : integer):TBinaryObject;
begin SetLength(Result, SizeOf(X)); Move(X, result[0], sizeof(X)); end;
Delphi-Quellcode:
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.
procedure TForm1.Button1Click(Sender: TObject);
var int : byte; bin : TBinaryObject; begin int:=244; bin:=inttobin(int); end; 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. |
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.
|
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:
|
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