Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

15.11.2015, 00:08

Beim Big-Endian muss ich dann lediglich den vector reversen.

Wenn der vector nur die 4 Byte des int enthält, dann ja; beachte allerdings, dass int auf verschiedenen Plattformen unterschiedlich groß ist und es streng genommen auch Middle-Endian und Multi-Endian gibt...

Ich muss also praktisch bestimmen, welchen Endian Typ mein OS benutzt, und dementsprechend handeln.

Genau das willst du vermeiden; das Beispiel von SpieleProgrammierer funktioniert unabhängig davon, welche Endianness die Maschine verwendet..

Am besten mal hier lesen: http://commandcenter.blogspot.com/2012/0…er-fallacy.html

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (15.11.2015, 00:18)


Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

12

16.11.2015, 10:53

Es wäre noch elegant, allerdings je nach Häufigkeit der Verwendung nicht zwingend praktikabel, einen neuen Datentyp zu erzeugen, den man dann z.B. network_endian_int32 nennt. Die Idee dabei wäre, dass man alle nötige Arithmetik bereitgestellt hat, und sowas wie Byte Swap (Sei es jetzt über Array-Zugriff und Rumgeshifte wie im von dot verlinkten Blogpost oder Spiele Programmierer's Beispiel, oder durch Zeugs wie __builtin_bswap32, womit man vorsichtig umgehen sollte) unter der Haube stattfindet. Nutzt du diesen Typ dann für deinen Header, hast du immer die Standard-Netzwerk-Byteorder (Big Endian), ohne auf Non-BE-Plattformen den Byteswap vergessen zu können.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

13

16.11.2015, 11:11

Ich hab das jetzt komplett anders gelöst. Sollte das nächste mal einfach wieder mehr überlegen ;)
Letztendlich bietet Qt genug high level support an, sodass ich mich praktischerweise darum gar nicht erst kümmern muss und auch will. Ist zwar schon, meine Ängste bestätigt bekommen zu haben (die Endians waren mir ja durchaus ein Begriff), nur hätte ich dann doch noch ein Stück weiter denken können und statt der rohen QByteArrays direkt auf die QDataStreams umsteigen können. Die erledigen sowas schon direkt mit ;)

Jedenfalls danke für die zahlreichen Antworten.
mfg

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

14

16.11.2015, 21:02

Naja, jetzt ist unser Forum um einen schönen Thread über Endianess reicher. Ist meine Meinung!

PS: Und um einen Offtopic-Kommentar auch. ;) Aber ich finde, dass muss mal gesagt werden: Recht viele Threads hier enden einfach, weil der TE eine ganz andere Lösung gefunden hat und dann kommt einem die Mühe so nutzlos vor, die andere in die Hilfestellungen hineingesteckt haben... is aber nich so :D
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Werbeanzeige