Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Wie speichere ich einen String binär ?


J.Borchert - Fr 05.09.03 11:00
Titel: Wie speichere ich einen String binär ?
Ich möchte eine Konvertierung der Daten einer Textdatei in ein vorgegebenes Format durchführen. Dazu folgendes Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
{$H-}
type KM = record
                nam: array [1..6of byte;
                d:double;
          end;
var  KMT:KM;
     s : string;
     i : integer;
     F : file of KM;
begin      assignFile(F,'TEST');
           rewrite(F);
           s:=' 8608+';
           for i:=1 to 6 do KMT.nam[i]:=ord(s[i]);
           KMT.d:=104564.45;
           write(F,KMT);
           closeFile(F);
end;

Wenn ich den Double wegnehme, werden 6 byte gespeichert. Wenn der Double (wie hier) folgt, werden für KMT.nam 8 byte geschrieben. Wie kann ich erreichen, das hier nur 6 byte für KMT.nam und 8 byte für KMT.d geschrieben werden ?

mfG Jürgen

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


kasi - Fr 05.09.03 16:47


Delphi-Quelltext
1:
type KM = packed record                    


KASI


Moderiert von user profile icontommie-lie: Delphi-Tags hinzugefügt


J.Borchert - So 07.09.03 21:14

:lol: Vielen Dank, hat auf Anhieb geklappt..........

Hatte wohl etwas unglücklich formuliert, die Double machten mir das Leben schwer. Ich weiß aber immer noch nicht so richtig, was es mit dem packed auf sich hat.
Habe leider nur eine abgespeckte Werbe-Version von D6.0 auf englisch.

Danke sagt Jürgen


tommie-lie - So 07.09.03 21:26

J.Borchert hat folgendes geschrieben:
Ich weiß aber immer noch nicht so richtig, was es mit dem packed auf sich hat.

Die x86er-Architektur hat 32 Bit breite Register. Dein Prozessor kann also am schnellsten 32Bit auf einmal verarbeiten.
Daher richtet Delphi einen Record automatisch an diese Breite aus.
Wenn du

Delphi-Quelltext
1:
2:
3:
4:
blah = record
blah: Byte
blah: LongWord
end;

schreibst, ist dein Record nicht, wie eigentlich zu vermuten, 5 Byte lang, groß, sondern 8. 32 Bit für den LongWord und 32 Bit für den Byte, obwohl dieser nur 8 Bit lang ist. die restlichen 24 Bit sind Nullen.

Du hattest durch dein array[1..6] 6 Byte (32+16=48 Bit) und durch den Double nochmal 8. Delphi lässt jetzt zwischen dem Array und dem Double 16 Bit frei, damit er das Array in zwei Registern und den Double in zwei Registern unterbringen kann, ohne die Daten auseinanderzupfriemeln. Durch das packed record wird der Programmablauf also langsamer, man sollte also falls möglich immer auf das record verzichten.
Manchmal kommt man aber nicht um ein packed umher, insbesondere wenn man mit einer API zu tun hat, die in C geschrieben wurde, so erwartet z.B. Windows in der Regel immer packed records.