Kniffligere Präprozessor-Direktive

Post Reply
Message
Author
IchBins

Kniffligere Präprozessor-Direktive

#1 Post by IchBins »

Ich habe ein Konstrukt

if (0x0011!=ntohl(0x0011))

mit dem ich feststelle, ob auf einer Maschine ein Unterschied zwischen Net- und Host-Byteorder besteht. Das Ding hätte ich jetzt gerne als Präprozessordirektive.

#if (0x0011!=ntohl(0x0011))

funzt aber leider nicht. Geht sowas überhaupt mit einer "normalen" funktion wie ntohl()?

tkortkamp
Posts: 143
Joined: 08. Apr 2001 22:56
Location: Bremen

Re: Kniffligere Präprozessor-Direktive

#2 Post by tkortkamp »

Nein.

Was spricht denn gegen if (0x0011!=ntohl(0x0011))?

c ya,
Tobias
dude i'm pretty damn sure you could script somebody back to life

Udo Kanter

Re: Kniffligere Präprozessor-Direktive

#3 Post by Udo Kanter »

#define BANANE (0x0011!=ntohl(0x0011))

...

if ( BANANE ) {

}

IchBins

Re: Kniffligere Präprozessor-Direktive

#4 Post by IchBins »

Die Geschichte mit dem #if funzt schlichtweg nicht, der Compiler (bzw. Präprozessor) weigert sich, das zu akzeptieren.

Tja und

#define BANANE (0x0011!=ntohl(0x0011))
if ( BANANE ) {

hat den Nachteil, dass das nach dem Präprozessor doch wieder nur aktiver Code der Sorte

if (0x0011!=ntohl(0x0011))

ist. Ich suche aber nach einer Möglichkeit, die den Code nur auf Maschinen drinlässt, deren Host-Byteorder != der Network-Byteorder ist und ansonsten den Teil innerhalb der #if-Bedingung schlichtweg weglässt.

Udo Kanter

Re: Kniffligere Präprozessor-Direktive

#5 Post by Udo Kanter »

Verstehe ich dich richtig?

Der Präprozessor soll rausfinden ob ein Unterschied zwischen der Net- und Hostbyteorder besteht?
Und zwar indem er den Ausdruck (0x0011!=ntohl(0x0011)) auswertet, wobei ntohl eine Funktion der C-Lib ist?

Das funktioniert so auf keinen Fall!

Vielleicht liefer der gcc ja Konstanten auf welcher Architektur er grade läuft, ansonsten musst du dir diese selber definieren, und beim Kompilieren entsprechen setzen.

in etwa

#ifdef ( I386 )
#elseif ( SPARC )
#elseif ( MIPS )
#else
#endif

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Kniffligere Präprozessor-Direktive

#6 Post by hjb »

Hi,

es gibt irgendwo ein Macro für die Byte-Order, ich weiß allerdings nicht, ob es Linux-spzifisch ist. Enfach mal grep ENDIAN in allen Includes...

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

IchBins

Re: Kniffligere Präprozessor-Direktive

#7 Post by IchBins »

Ok, dann frag' ich mal anders <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Welche Byteorder ist im Netz denn üblich - das Gleiche, was Motorola-Prozessoren auch machen, also von High-Byte nach Low-Byte (richtig rum also <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> ?

Und wie sieht die Byteorder auf einem Sparc-Prozessor aus? Mehr als ix86, PPC und Sparc will ich eh' nicht abdecken...

Wolfgang

Re: Kniffligere Präprozessor-Direktive

#8 Post by Wolfgang »

Hi!

Habe mal eben im IRC einen Sparc-Assemblerprogrammierer gefragt:

<wolfgang> is sparc correct-endian?
<inituni> wolfgang : no

Cheers,
GNU/Wolfgang

user1

Re: Kniffligere Präprozessor-Direktive

#9 Post by user1 »

Tach Zusammen

Hat ein normaler PC-CPU die Netzwerk Byteorder oder gibt es da noch Unterschiede zwischen AMD und Intel?

Habe über localhost auf einen Server mit Telnet zugegeriffen, der den Port nicht mit htns(PORT) definiert hatte, und es ging nicht. Es funktionierte erst, als ich htns() benutzte.
Ach ja, ich habe einen Athlon.

Kennt jemand den Grund?


thx
user1

IchBins

Re: Kniffligere Präprozessor-Direktive

#10 Post by IchBins »

So, was ich inzwischen rausbekommen habe:

Network-Byteorder = Motorola = "richtig rum", also HighByte/LowByte

Alle Intel- (und AMD-) Prozessoren haben keine Network-Byteorder, sondern sind "falschrum" (gerade anders herum, wie Zahlen schriftlich auch dargestellt werden), also LowByte/HighByte

Tja und Sparc? Keine Ahnung...

user1

Re: Kniffligere Präprozessor-Direktive

#11 Post by user1 »

Tach

thx

Aber wieso hat der PC little endian? Ist doch falsch <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
Im Dezimalen kommt ja auch die hochwertigste Zahl zuerst.


Gruss user1

IchBins

Re: Kniffligere Präprozessor-Direktive

#12 Post by IchBins »

Klar ist das falsch - aber sag' bzw. frag das Intel, die haben sich den Mist einfallen lassen! Naja, von denen stammen ja noch andere dämliche Ideen wie z.B. die Geschichte mit den nicht beliebig benutzbaren Prozessorregistern, die außer den Chipdesignern wahrscheinlich kein Mensch wirklich verstanden hat.

Btw: Ich weiß nicht mehr genau, ob das beim Alpha so ist, aber es gibt noch schrägere Zahlendarstellungen. Wenn Motorola z.B. eine 32-Bit-Zahl als AABBCCDD und Intel als DDCCBBAA darstellt, macht dieser (Alpha?) da BBAABBCC draus *graus*

user1

Re: Kniffligere Präprozessor-Direktive

#13 Post by user1 »

Bei einem 16 Bit Prozessor könnte ich mir das noch vorstellen, aber bei einem 64 Bit Alpha...

IchBins

Re: Kniffligere Präprozessor-Direktive

#14 Post by IchBins »

OK, es hat sich geklärt, Sparcs sind genau so falsch rum wie die Intel-Dinger: http://www.support.compaq.com/amt/freep ... ndian.html

Gregor Seiler

Re: Kniffligere Präprozessor-Direktive

#15 Post by Gregor Seiler »

Hallo!
Auch wenn es auf den ersten Blick falschherum erscheint, little-endian hat einige signifikante Vorteile. Zum Beispiel beim Vergroessern von Speicherbereichen (relloc()).
Soweit ich weiss, sind die meisten Netzwerkprotokolle big-endian. Er bedarf allerdings nur einer kleinen Funktion, um die "byteorder" auf einer little-endian Masschine entsprechend zu aendern.
PPC ist uebrigens bi-endian.

Gruss,
Gregor

Post Reply