| Autor |
Beitrag |
peeage
      
Beiträge: 50
|
Verfasst: Fr 18.04.08 17:50
Hallo zusammen, hab hier ein kleines Problem ( Verständnisproblem? ) ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function ByteToHex(InByte:byte):String; const Digits:array[0..15] of char='0123456789ABCDEF'; begin result:=digits[InByte shr 4]+digits[InByte and $0F]; end;
var w: word; p: pByte; begin w := 1; p := @w;
ShowMessage( ByteToHex(p^) ); inc(p);
ShowMessage( ByteToHex(p^) ); end; |
Habe ich hier eventuell ein Verständnisproblem? Normalerweise müsste das Word doch folgender Maßen aussehen: 00 01, oder ?
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Fr 18.04.08 17:58
Ich bin mir nicht sicher, aber ich denke, dass das Inc(p); hier nicht das tut, was du erwartest (unsicher, weil ich gerade kein Delphi installiert habe und es daher nicht überprüfen kann).
Wäre es generell nicht einfacher, das Wort wie folgt in zwei Bytes zu unterteilen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var HighByte, LowByte: Byte; w: Word;
HighByte := (w and $FF00) shr 8; LowByte := (w and $00FF); |
AXMD
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 18.04.08 18:44
Nein, das Inc(P); tut hier schon, das was es soll: Den Zeiger um ein Byte verschieben.
Und nein, Delphi vertauscht die Bytes nicht, sondern die CPU arbeitet mit Little Endian, d.h. das erste Byte im Speicher gibt den niederwertigen Teil des Words, das 2. Byte den höherwertigen Teil des Words an.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
peeage 
      
Beiträge: 50
|
Verfasst: Fr 18.04.08 22:44
hmm..danke für eure antworten! wie schaut es denn da bei einem dword aus, denn bei einem dword tritt genau dasselbe auf -> ich bekomme die bytes in umgekehrter reihenfolge.
mein problem ist das ich einem server mittels tcp/ip gewisse daten ( bestehend aus words, dwords, einzelnen bytes ) übergeben muss. diese daten konfiguriere ich im programm vorerst durch variablen, wessen inhalt (bytes) ich dann nacheinanderfolgend in einen durch "getmem" zugewiesenen speicherbereich schreibe. zum beispiel erwartet der server ein dword, welches das protokoll bestimmt. wenn ich nun in meinem programm eine variable vom typ eines dwords habe, welcher ich den wert 1 zuweise ( = Protokoll 1 ), dann sieht das word in bytes ausgedrückt folgender maßen aus: 01 00 00 00 .... der server erwartet aber die bytefolge 00 00 00 01 damit das protokoll der version 1 genutzt wird.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Fr 18.04.08 23:04
Auf Server-Seite schreibst du die Werte genau in der ankommenden Reihenfolge 01 00 00 00 wieder in eine DWord Variable. Da der Server ebenfalls mit Little-Endian arbeitet, sollte hier nun wieder ganz korrekt die 1 drin stehen.
|
|
peeage 
      
Beiträge: 50
|
Verfasst: Fr 18.04.08 23:10
ja, in meinem fall wäre der server aber "login.icq.com" welcher genau die genannte reihenfolge erwartet. wäre es hier sinnvoll in meinem programm die bytes durch eine prozedur einfach tauschen zu lassen, oder gibts eine komfortablere lösung ?
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 19.04.08 03:07
Für das Umwandeln von Big in Little Endian bzw. umgekehrt gibt es hier eine Funktion:
www.delphi3000.com/a...cle_1325.asp?SK=word
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 19.04.08 10:07
Für Netzwerk-Protokolle wird meistens Bit Endian verwendet (aus historischen Gründen). Um von der lokalen Maschinen-Darstellung in die Netzwerk-Darstellung umzuwandeln gibt es die Funktion hton (Host-to-Network Order) (je nach Suffix für die verschiedenen Datentypgrößen).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|