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

11

17.06.2014, 20:02

Nur mal aus Interesse: Gibt es für Byte-/Bitswaps standardmäßig was in der std?

EDIT: Byteswap ja wohl eher nicht, würde man sich wohl selbst drum kümmern müssen, oder?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »anti-freak« (17.06.2014, 20:12)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

17.06.2014, 20:14

Die Netzwerk-Libs haben da meist was. ntohs, ntohl, etc.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

13

17.06.2014, 20:20

Kannst auch Builtins von MSVC oder GCC/Clang nutzen, wie z.B. __builtin_bswap32.

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:

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

17.06.2014, 20:27

Man kann sich ja selbst einen kleinen Wrapper darum bauen.
Ein paar Präprozessorverzweigungen und für im schlechtestens Fall einige zehn Zeilen hast du GCC/Clang und MSVC als auch den allgemeinen Fall für alle Typen abgedeckt.
Für den MSVC: _byteswap_ulong und andere

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

15

17.06.2014, 23:35

Das Problem kommt mir bekannt vor ;)
Bis jetzt konnte ich es übrigens auch noch nicht lösen, egal ob buildin, eigener Kram, uint32_t oder sonst was...

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

16

18.06.2014, 02:44

Wie wäre es, selber eine Funktion zu schreiben, die aus einem Integer ein Byte-Array mit deiner gewünschten Byte-Reihenfolge und Größe macht.
Für die Rückkonvertierung dasselbe, aus den Arrays einen int erzeugen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

18.06.2014, 06:05

Das Problem kommt mir bekannt vor ;)
Bis jetzt konnte ich es übrigens auch noch nicht lösen, egal ob buildin, eigener Kram, uint32_t oder sonst was...
Und wo genau ist das Problem gewesen? Endianess zu bestimmen und einen eigenen Stream-Reader/Writer mit Endianess-Korrektur zu bauen ist eigentlich ja kein großer Akt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

18

18.06.2014, 09:15

Zeitmangel ist glaube ich gerade das größe Problem...
In zwei Wochen, ab dann wird mindestens einen Monat durchprogrammiert :)

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

19

18.06.2014, 11:17

(Endianness schreibt man mit Doppel-"n".)

Dein Endianness-Problem besteht an der Stelle ja nur, weil du die Instruktionen CISC-artig als Byte-Array ablegst. Nimm doch wie vorgeschlagen uint32_t / int32_t. Dann musst du dich nur noch beim Laden oder Speichern des Bytecodes um einen Byteswap kümmern. Da du wahrscheinlich primär bis fast ausschließlich mit x86 arbeitest, könntest du den Bytecode immer im Little Endian -Format abspeichern. POWER PC & Co. müssten dann natürlich immer alle Daten beim Laden byteswappen, aber dafür musst du dich dann auf x86-Plattformen überhaupt nicht mehr um sowas kümmern.

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:

20

18.06.2014, 11:37

Also ich hab mich jetzt weit und breit informiert über die ganze Thematik, allerdings verstehe ich einige Dinge nicht.

Die Endianness ist ja Prozessor abhängig, aber wie prüfe ich denn welche Endianness der Prozessor verwendet?
Wie finde ich also raus, ob er Big Endianness oder Little Endianness verwendet?

Und verstehe ich es richtig, dass sobald eine andere Endianness als auf dem System wo die Datei erstellt wurd vorliegt,
einfach nur alle Bytes (bzw. Bits) neu sortiert werden müssen? Also von niedrig -> hoch bzw. andersherum?

Und um das Problem mit den verschiedenen Byte größen für die nativen Datentypen zu umgehen, muss ich mich auf eine Bit Zahl festlegen?
Also muss ich z.B int8_t verwenden, aber wie siehts denn z.B mit nem char aus, hat das immer eine konstante Größe von 1 Byte?
Und ein Float? Gibt es da auch z.B eine 16 oder 32 Bit Version oder ist da die Byte größe auch Konstant?

Middle Endianness muss ich nicht beachten, richtig?

Werbeanzeige