[Delphi7] Irritant probleempje met wegschrijven DWORD

Pagina: 1
Acties:

  • Wilde
  • Registratie: December 2000
  • Niet online
Ik hoop dat iemand me kan helpen want ik zit met een lullig probleempje

Ik heb een waarde, 33685000, in een Longword zitten. Deze wil ik opslaan op
de schijf in een bestandje.. Nou maak ik een variable F als File of LongWord aan.

Als ik de waarde wegschrijf maakt hij er in hex 08 FE 01 02 van. Echter hij moet het opslaan als 02 01 FE 08 !!

Nou heb ik voordat ik wegschrijf al geprobeert om met SWAP te hex bytes om te draaien, maar dan pakt ie alleen de laatste 2 (16 bits).

Is er een functie, of formule voor om de 4 bytes om te draaien ???????????

Specs: 9800X3D, RTX 5090, 64GB, VR: Pimax Crystal-Light


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 10-08 15:44

klinz

weet van NIETS

Beetje ANDen, SHRen en SHLen. Dan kom je er wel. Waarom wil je het zo opslaan? Vanwege de endianness van je doelplatform?

Verwijderd

Er is wel een asmebler instructie voor, BSWAP, of anders schrijf je het zelf..
function swapbytes(a: longword):longword;
asm
bswap eax
end;

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 16:33

Hu9o

Schokkend

Heeft dit niet iets temaken met most of least significant byte first??

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 14:22

Tomatoman

Fulltime prutser

Even uit de losse pols:
Delphi:
1
2
3
4
function ChangeEndian(Value: Longword): Longword;
asm
  BSWAP    EAX
end;

Anyway, met BSWAP kun je de bytes van een 32-bits getal swappen (van little endian naar big endian en omgekeerd). Je kunt natuurlijk ook gewoon de bytes zelf swappen:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type
  TLongword = packed record // 32-bit unsigned integer
    HiWordHiByte: Byte;
    HiWordLoByte: Byte;
    LoWordHiByte: Byte;
    LoWordLoByte: Byte;
  end;

function ChangeEndian(Value: Longword): Longword;
var
  LW: TLongWord;
begin
  LW := TLongWord(Value);
  Result := (LW.HiWordHiByte shl 24) or (LW.HiWordLoByte shl 16) or
    (LW.LoWordHiByte shl 8) or LW.LoWordLoByte;
end;

Een goede grap mag vrienden kosten.


  • Wilde
  • Registratie: December 2000
  • Niet online
Is het niet zo dat BSwap alle bits helemaal omdraait ? Wat ik bedoel is de lage 16 bits hoog zetten, en de hoge laag. Zodat 0201FE08 bv 08FE0102 wordt.

Specs: 9800X3D, RTX 5090, 64GB, VR: Pimax Crystal-Light


  • Wilde
  • Registratie: December 2000
  • Niet online
Oh my mistake.. Ik zie dat jouw tweede voorbeeld precies hetgeen doet wat ik nodig heb ! Onwijs bedankt ik kan weer verder

Ik ben een stuk assembled code aan het naschrijven in delphi. Nou schreef de asm code 0201FE08 weg, en ik in delphi 08FE0102. En kwam er maar niet uit hoe ze om te draaien.

Ik was zelfs van plan de boel om te zetten naar binary (naar een string). Dan de bits in de
string omgooien en weer terug. Zal onwijs traag geworden zijn :)

Specs: 9800X3D, RTX 5090, 64GB, VR: Pimax Crystal-Light


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

En begrijp je nu ook waarom die long zo wordt weggeschreven?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Wilde
  • Registratie: December 2000
  • Niet online
Ik heb 't wel geweten geloof ik :)

jaja dat hoef je niet te geloven

Was 't niet iets dat de processor long in omgedraaide volgorde inleest?

Specs: 9800X3D, RTX 5090, 64GB, VR: Pimax Crystal-Light


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 10-08 15:44

klinz

weet van NIETS

Wilde schreef op 13 October 2003 @ 22:37:
Was 't niet iets dat de processor long in omgedraaide volgorde inleest?
Ja, maar daarom hoef je zelf nog geen maatregelen te treffen. Bij het wegschrijven heeft immers dezelfde exercitie plaatsgevonden.
Pagina: 1