Seite 1 von 1
*Erledigt* LittleEndian <> BigEndian bei Word Variable
Verfasst: 24.11.2006 19:18
von mknjc
Hi,
Da hab ich noch ein fehler ausgegraben:
Ich bekomm von einem Server ein Datenpaket das in 5 teile unterteilt ist.
1. 1Byte lange Konstante
2. 1Byte mit unbekannten inhalt
3. 2Byte Laufvariable
4. 2Byte Länge des folgendem pakets
5. ??? Byte
Als Hex sieht teil 4 so aus: 00 04
PB macht wenn ich das mit PeekW auslese 1024 draus.
?LittleEndian <> BigEndian?
Wie krieg ich PB jetzt dazu daraus 4 zu machen wie es richtig ist?
Mfg mknjc
Verfasst: 24.11.2006 19:36
von ts-soft
Verfasst: 24.11.2006 19:58
von mknjc
Hm naja dann werd ich das wohl so machen müssen.
THX
Mfg mknjc
Verfasst: 24.11.2006 19:59
von #NULL
<edit:>
hach, das vorzeichen muß man auch noch beachten
Code: Alles auswählen
a.w = 128
b.w = PeekB(@a)<<8 + PeekB(@a + 1)
c.w = PeekB(@b)<<8 + PeekB(@b + 1)
Debug a
Debug b
Debug c
Debug ""
a.w = 128
b.w = ( PeekB(@a)<<8 + PeekB(@a + 1) ) * (1-2*(0 Or a<0)) ; << korrekt
c.w = ( PeekB(@b)<<8 + PeekB(@b + 1) ) * (1-2*(0 Or b<0)) ; << korrekt
Debug a
Debug b
Debug c
Debug ""
Debug ""
a.w = -128
b.w = PeekB(@a)<<8 + PeekB(@a + 1)
c.w = PeekB(@b)<<8 + PeekB(@b + 1)
Debug a
Debug b
Debug c
Debug ""
a.w = -128
b.w = ( PeekB(@a)<<8 + PeekB(@a + 1) ) * (1-2*(0 Or a<0)) ; << korrekt
c.w = ( PeekB(@b)<<8 + PeekB(@b + 1) ) * (1-2*(0 Or b<0)) ; << korrekt
Debug a
Debug b
Debug c
<edit2:>
es stimmt immernoch nicht (z.b. a.w = -256) aber mein rechner geht jetzt von quantencomputern träumen..
Verfasst: 25.11.2006 11:35
von mknjc
Tja ich weiß nur das der Server vorzeichenlose Variablen fordert.
Die genau andersrum ablaufen:
PB: A0 14 04 00
Server: 00 04 14 A0
Alle anderen Programme die ich kenne machen es andersrum nur PB nich.
Naja dann muss ich nochmal eine reihe Speicherfunktionen neu schreiben.
[Edit]
Ich hab es so gelöst.
Nach einer kurzer Testreihe hats geklappt.
Code: Alles auswählen
Procedure.w BEPeekW(*Speicher.l)
ProcedureReturn PeekB(*Speicher)<<8 + PeekB(*Speicher + 1)
EndProcedure
Procedure.l BEPeekL(*Speicher.l)
ProcedureReturn PeekB(*Speicher)<<24 + PeekB(*Speicher + 1)<<16 + PeekB(*Speicher + 2)<<8 + PeekB(*Speicher + 3)
EndProcedure
Procedure BEPokeW(*Speicher.l, Nummer.w)
PokeB(*Speicher, PeekB(@Nummer + 1))
PokeB(*Speicher + 1, PeekB(@Nummer))
EndProcedure
Procedure BEPokeL(*Speicher.l, Nummer.l)
PokeB(*Speicher, PeekB(@Nummer + 3))
PokeB(*Speicher + 1, PeekB(@Nummer + 2))
PokeB(*Speicher + 2, PeekB(@Nummer + 1))
PokeB(*Speicher + 3, PeekB(@Nummer))
EndProcedure
Mfg mknjc
Verfasst: 25.11.2006 11:59
von #NULL
ich frag mich nur grad, ob das vorzeichen-bit bei BigEndian im höchstwertigen byte bleibt.

, auch wenn diese byte zuerst steht.
..ne quatsch, ich glaub das problem liegt nur an PeekB(), weil diese funktion ja das höchste bit immer als vorzeichen-bit interpretiert, und das z.b. auch im 1, 2 und 3 byte eines quad-wertes.
Verfasst: 25.11.2006 12:15
von mknjc
Naja fürs erste reichts.
Und wenns Probleme gibt können die Benutzer einfach den Loglevel auf -1 stellen und mir den Log senden.
Mfg mknjc
Verfasst: 25.11.2006 12:26
von #NULL
ich glaube diese procedure müßte alles richtig machen, jedenfalls wird hier wirklich einfach nur die byte-reihenfolge vertausch, ohne bits zu interpretieren.
Code: Alles auswählen
; kehrt die reihenfolge der 'bytes' bytes im speicher ab *p um
Procedure toggleEndian(*p, bytes.l)
*buff=AllocateMemory(bytes)
If *buff
For i=0 To bytes-1
CopyMemory( *p+((bytes-1)-i), *buff+i, 1)
Next
CopyMemory( *buff, *p, bytes)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
b.b=33
toggleEdnian(@b, SizeOf(b) ) :: Debug b
toggleEdnian(@b, SizeOf(b) ) :: Debug b
b.b=-33
toggleEdnian(@b, SizeOf(b) ) :: Debug b
toggleEdnian(@b, SizeOf(b) ) :: Debug b
Debug ""
w.w=33
toggleEdnian(@w, SizeOf(w) ) :: Debug w
toggleEdnian(@w, SizeOf(w) ) :: Debug w
w.w=-33
toggleEdnian(@w, SizeOf(w) ) :: Debug w
toggleEdnian(@w, SizeOf(w) ) :: Debug w
Debug ""
l.l=33
toggleEdnian(@l, SizeOf(l) ) :: Debug l
toggleEdnian(@l, SizeOf(l) ) :: Debug l
l.l=-33
toggleEdnian(@l, SizeOf(l) ) :: Debug l
toggleEdnian(@l, SizeOf(l) ) :: Debug l
Debug ""
q.q=33
toggleEdnian(@q, SizeOf(q) ) :: Debug q
toggleEdnian(@q, SizeOf(q) ) :: Debug q
q.q=-33
toggleEdnian(@q, SizeOf(q) ) :: Debug q
toggleEdnian(@q, SizeOf(q) ) :: Debug q
Verfasst: 25.11.2006 13:24
von ts-soft
Im ASCII-Modus sollte PeekC helfen

Verfasst: 25.11.2006 17:03
von HeX0R
Code: Alles auswählen
Procedure.w SwapWord(Value.w)
!MOVSX Eax, word [p.v_Value]
!BSWAP Eax
!SHR Eax, $10
ProcedureReturn
EndProcedure