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

Code: Alles auswählen

a.w = 1024
b.w = PeekB(@a) + PeekB(@a + 1)
Debug b

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

Code: Alles auswählen

a.w = 1024
b.w = PeekB(@a)<<8 + PeekB(@a + 1)
Debug b

<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 :wink:

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