*Erledigt* LittleEndian <> BigEndian bei Word Variable

Anfängerfragen zum Programmieren mit PureBasic.
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

*Erledigt* LittleEndian <> BigEndian bei Word Variable

Beitrag 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
Zuletzt geändert von mknjc am 24.11.2006 19:59, insgesamt 1-mal geändert.
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

a.w = 1024
b.w = PeekB(@a) + PeekB(@a + 1)
Debug b
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag von mknjc »

Hm naja dann werd ich das wohl so machen müssen.
THX

Mfg mknjc
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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..
my pb stuff..
Bild..jedenfalls war das mal so.
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag 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
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag 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
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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

my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Im ASCII-Modus sollte PeekC helfen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Code: Alles auswählen

Procedure.w SwapWord(Value.w)
	!MOVSX Eax, word [p.v_Value]
	!BSWAP Eax
	!SHR Eax, $10
	ProcedureReturn
EndProcedure
Antworten