Autor Beitrag
peeage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Fr 18.04.08 17:50 
Hallo zusammen, hab hier ein kleines Problem ( Verständnisproblem? ) ...

ausblenden 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..15of 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^) );  // Ausgabe :: 01

   inc(p);

   ShowMessage( ByteToHex(p^) );  // Ausgabe :: 00

   // das heisst unser word von der länge = 2 bytes, welches
   // den wert 1 angenommen hat, schaut folgender maßen aus: 01 00
end;



Habe ich hier eventuell ein Verständnisproblem? Normalerweise müsste das Word doch folgender Maßen aussehen: 00 01, oder ?
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  HighByte, LowByte: Byte;
  w: Word;

//...

  HighByte := (w and $FF00shr 8;
  LowByte := (w and $00FF);


AXMD
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.