Ich schreibe ein Programm auf Linux in C, um Kerndateien zu analysieren, die von einem eingebetteten System erzeugt werden. Die Kerndateien können Little Endian (ARM) oder Big Endian (MIPS) sein, und das zu analysierende Programm läuft möglicherweise auf einem kleinen Endian-Host (x86) oder Big-Endian (PowerPC).Unterstützende Byte-Reihenfolge im Linux-Benutzerbereich
Mit Blick auf die Header weiß ich, ob der Kern LE oder BE ist. Ich würde lieber mein Programm nicht müssen wissen, ob der Host, auf dem es läuft, ist kleine oder große Endian, würde ich gerne eine API verwenden, um es für mich zu behandeln. Wenn es keine bessere Option gibt, werde ich mich auf #ifdef __BIG_ENDIAN__ verlassen.
Im Linux-Kernel haben wir cpu_to_le32 et al. Von nativer Byteordnung in Little Endian usw. konvertieren. Im Userspace gibt es htonl et al, die von nativ zu big endian konvertieren, aber kein Äquivalent für native zu Little Endian Ich kann finden.
Kann jemand eine geeignete API für Benutzerraum vorschlagen?
Bearbeiten: Nur um klar zu sein, ich bin auf der Suche nach einer API, die bereits weiß, ob meine CPU ist groß oder Little Endian und Swaps Byes entsprechend. Ich möchte meinen Code dafür nicht mit #ifdefs einstreuen müssen. Ich suche nicht nur Code-Snippets, um Bytes zu tauschen. Danke für die, aber das war nicht der Punkt.
Aber mit diesen Codeschnipsel können Sie trivialerweise ein Makro schreiben, das das tut, also Ihre eigene "API" schaffend, nein? – orip
Was für ein eingebettetes System ist das? Können Sie nicht einfach einige cross gdb verwenden, um die Kerndateien zu betrachten? – sigjuice
Könnte ich meine eigene API schreiben? Sicher. Ich möchte nur vermeiden, #ifdef __BIG_ENDIAN__, wenn es eine sauberere, wartungsfreundlichere Möglichkeit gibt, es über eine vorhandene API zu tun, die bereits weiß, ob meine CPU groß oder Little Endian ist. – DGentry