*Erledigt* LittleEndian <> BigEndian bei Word Variable
*Erledigt* LittleEndian <> BigEndian bei Word Variable
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
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
Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
- 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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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..
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.
Mfg mknjc
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
Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
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.

..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.
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
- 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
Im ASCII-Modus sollte PeekC helfen 

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 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:
Code: Alles auswählen
Procedure.w SwapWord(Value.w)
!MOVSX Eax, word [p.v_Value]
!BSWAP Eax
!SHR Eax, $10
ProcedureReturn
EndProcedure