Big Endian Little Endian Binär Optionen

Ich versuche, mein Verständnis des STFS-Dateiformats zu verbessern, indem ich ein Programm zum Lesen aller verschiedenen Bits von Informationen verwende. Mit einer Website mit einem Verweis, welche Offsets welche Informationen enthalten, habe ich einen Code geschrieben, der einen binären Leser durch die Datei hat und die Werte in die richtigen Variablen platziert. Das Problem ist, dass alle Daten zu Big Endian gemacht werden, und alles, was der binäre Leser liest, ist Little Endian. Also, was ist der beste Weg, um über die Festsetzung dieser Ich kann eine Mimik Klasse von Binary Reader, die eine umgekehrte Array von Bytes gibt es etwas, was ich kann in der Klassen-Instanz ändern, die es in großen Endian zu lesen, so dass ich nicht umschreiben müssen Alles irgendeine Hilfe wird geschätzt. Bearbeiten: Ich habe versucht, Encoding. BigEndianUnicode als Parameter hinzuzufügen, aber es liest noch wenig endian. Meiner Meinung nach möchten Sie vorsichtig sein, dies zu tun. Der Grund, den man von BigEndian zu LittleEndian umwandeln möchte, ist, wenn die Bytes, die gelesen werden, in BigEndian sind und das OS, das gegen sie berechnet, in LittleEndian arbeitet. C ist kein Fenster nur Sprache mehr. Mit Ports wie Mono und anderen Microsoft Plattformen wie Windows Phone 78, Xbox 360Xbox One, Windwos CE, Windows 8 Mobile, Linux Mit MONO, Apple mit MONO, etc. Es ist durchaus möglich, dass die Betriebssystemplattform in BigEndian sein könnte Wenn du den Code umwandelst, ohne irgendwelche Schecks zu machen, Der BitConverter hat bereits ein Feld auf es namens IsLittleEndian können Sie dies verwenden, um festzustellen, ob die Betriebsumgebung in LittleEndian ist oder nicht. Dann können Sie das Umkehren bedingt machen. Als solches habe ich eigentlich nur einige Byte-Erweiterungen geschrieben, anstatt eine große Klasse zu machen: Also stell dir diesen Beispielcode vor: beantwortet Feb 6 14 um 7:39 Deine Antwort 2017 Stack Exchange, IncWenn die Übertragung von binären Ganzzahlen über ein Netzwerk, ist es wichtig zu gewährleisten Dass die Sende - und Empfangsanlagen das gleiche Format verwenden oder dass eine Umwandlung erfolgt ist. Wenn ein Big-Endian-Computer die obige Binärzahl an einen Little-Endian-Computer ohne Umwandlung gesendet hat, würde er als 513 interpretiert. Um Probleme in einem heterogenen Netzwerk zu vermeiden, werden Binärzahlen vor der Übertragung in das Netzwerk-Standardformat (Big Endian) konvertiert. Die Funktionen: htons Host to Network Short htonl Host to Network Long kann verwendet werden, um binäre Daten in Netzwerk-Standard-Format zu konvertieren. Historische Anmerkung: Die Namen Big Endian und Little Endian kommen aus Swifts Roman Gullivers Travels. In dieser Geschichte wurden die Lilliputianer in die Big Endians und die Little Endians geteilt, auf deren Ende ein gekochtes Ei, das sie glaubten, geöffnet werden sollte. Ich habe versucht, mich zu durchsuchen, aber ich konnte nicht viel über binäre Literale und Endianness finden. Sind binäre Literale Little-Endian, Big-Endian oder etwas anderes (wie zB die Anpassung der Zielplattform) Als Beispiel, was ist der Dezimalwert von 0b0111. Ist es 7 Platform spezifisch Etwas anderes Edit: Ich habe einen schlechten Wert von 7 ausgewählt, da es innerhalb eines Bytes dargestellt wird. Die Frage wurde trotz dieser Tatsache ausreichend beantwortet. Einige Hintergrund: Im Grunde versuche ich herauszufinden, was der Wert der am wenigsten signifikanten Bits ist, und Maskierung es mit binären Literalen schien wie ein guter Weg zu gehen. Aber nur wenn es eine gewisse Garantie für Endianness gibt. Fragte am 18.12 um 16:21 Kubisch: Natürlich haben dezimalale Literale Endianness. Das ist, warum 7x3 ist 21 und nicht 12. Jede geordnete Reihenfolge der Ziffern, unabhängig von der Basis hat eine Endianness. Da die Ordnung auf - oder absteigen kann, gibt es natürlich auch Groß-Endian und Little-Endian. (Nomiddle-endianquot ist die sonderbare 3412 ungeordnete Sequenzen) ndash MSalters Dec 18 14 at 17:44 Endianness ist nie direkt in den Code ausgesetzt, es sei denn, du versuchst es wirklich auszuprobieren (zB mit Zeigertricks). 0b0111 ist 7, seine die gleichen Regeln wie hex, Schreiben bedeutet nicht 0x77AA auf einigen Plattformen, weil das wäre absurd. Wohin würden die extra 0s, die fehlen, sowieso gehen, würden sie auf der Vorderseite gepolstert werden, dann ist die ganze Sache umgedreht, oder würden sie hinzugefügt werden, nachdem ich keine Ahnung habe, was jemand erwarten würde, wenn das der Fall wäre. Der Punkt ist, dass C keine Annahmen über die Endianness der Maschine macht, wenn Sie Code mit Primitiven schreiben und die Literale, die es bietet, wird das Verhalten von Maschine zu Maschine gleich sein (es sei denn, Sie beginnen, das Typsystem zu umgehen, welches Sie können Müssen Sie tun) Um Ihr Update zu adressieren: die Zahl ist die Art, wie Sie es schreiben. Die Bits werden nicht nachbestellt oder so etwas, das bedeutendste Bit ist auf der linken Seite und das niedrigstwertige Bit ist auf der rechten Seite. Es scheint ein Missverständnis hier zu sein, was Endlichkeit ist. Endianness bezieht sich darauf, wie Bytes im Gedächtnis bestellt werden und wie sie interpretiert werden müssen. Wenn ich dir die Nummer 4172 gegeben habe und sagte, wenn dies vier-tausend einhundertsechsundsiebzig ist, was ist die endianness du kannst nicht wirklich eine Antwort geben, weil die Frage keinen Sinn macht. (Man könnte argumentieren, dass die größte Ziffer auf der linken Seite Big Endian bedeutet, aber Id nicht einverstanden, dass dies gültig ist). Dies ist nur eine Nummer, es gibt keine Bytes zu interpretieren, es gibt keine Speicheradressen. Angenommen, 4-Byte-Integer-Darstellung, die Bytes, die es entsprechen, sind: so, entweder einer von denen und sagte, dies ist die Computer interne Darstellung von 4172 Sie konnte feststellen, ob seine kleine oder große endian. Also jetzt betrachten Sie Ihre binäre wörtliche 0b0111 diese 4 Bits stellen eine nybble, und kann als entweder gespeichert werden Aber Sie müssen nicht kümmern, weil dies auch von der Hardware behandelt wird, die Sprache diktiert, dass der Compiler liest von links nach rechts, höchst signifikante Bit Zu wenig signifikant Bit Endianness ist nicht über einzelne Bits. Angesichts der Tatsache, dass ein Byte 8 Bits ist, wenn ich dir 0b00000111 gebe und sage, ist das kleine oder große Endian nochmal, du kannst nicht sagen, weil du nur ein Byte hast. Endianness ordnet keine Bits in einem Byte an, bezieht sich auf die Neuordnung von ganzen Bytes (es sei denn, natürlich haben Sie ein Bit-Bytes). Sie müssen sich nicht darum kümmern, was Ihr Computer intern benutzt. 0b0111 nur spart Ihnen die Zeit von zu schreiben Sachen wie ohne Notwendigkeit zu kommentieren erklären die Bedeutung der Zahl. Ich möchte darauf hinweisen, dass bei einem hinreichend niedrigen Programmierniveau man nicht die Endlosigkeit vermeiden kann, weil die Vorgaben von dem, was Sie implementieren, ihre Eingaben oder Ausgänge beauftragen, um in kleinem Drittel zu sein. Dazu gehören Netzwerkprotokolle, kryptographische Algorithmen und so weiter. Nur weil du es nicht machst, bedeutet das nicht, dass sie nicht existieren, und endianness leckt aus dem netten bequemen Typsystem in diesen Situationen aus. Also der Zitat, der für deinen eigenen Goodquot-Klang klug ist, scheint ungerechtfertigt zu sein. Ndash Thomas Dec 19 14 at 2:37 RyanHaining Mit den Htons aus deinem Kommentar: das ist einfach zu implementieren, ohne irgendwelche Annahmen über Endianness zu machen: uint16t htons (uint16t x) Es macht einige Annahmen über die Darstellung von uint16t. Aber endianness ist nicht eine dieser annahmen, und zumindest klang optimiert das sehr gut Ich stimme dem Kommentar zu, dass die Leute generell Code schreiben sollten, der keine Annahmen über Endianness macht, es ist einfach nicht nötig. Ndash hvd Dec 19 14 at 8:55 Alle ganzzahligen Literale, einschließlich binärer, werden auf die gleiche Weise interpretiert wie wir normalerweise Zahlen lesen (links am meisten Ziffer ist am bedeutendsten). Der C-Standard garantiert die gleiche Interpretation der Literale, ohne sich mit der spezifischen Umgebung beschäftigen zu müssen. So musst du dich in diesem Zusammenhang nicht mit endianness beschäftigen. Dein Beispiel von 0b0111 ist immer gleich sieben. Der C-Standard verwendet keine Begriffe der Endlichkeit in Bezug auf Zahlenliterale. Vielmehr beschreibt es einfach, dass die Literale eine konsequente Interpretation haben und dass die Interpretation die ist, die man erwarten würde. C Standard - Integer Literals - 2.14.2 - Absatz 1 Ein Ganzzahl-Literal ist eine Folge von Ziffern, die keinen Perioden - oder Exponenten-Teil hat, mit optionalen Trenn-Einzelzitaten, die bei der Bestimmung ihres Wertes ignoriert werden. Ein Integer-Literal kann ein Präfix haben, das seine Basis und ein Suffix spezifiziert, das seinen Typ spezifiziert. Die lexikalisch erste Ziffer der Ziffernfolge ist die bedeutendste. Ein Binär-Integer-Literal (Basis 2) beginnt mit 0b oder 0B und besteht aus einer Folge von Binärziffern. Ein Oktal-Integer-Literal (Basis 8) beginnt mit der Ziffer 0 und besteht aus einer Folge von Oktalziffern. Ein Dezimal-Integer-Literal (Basis zehn) beginnt mit einer anderen Ziffer als 0 und besteht aus einer Folge von Dezimalstellen. Ein hexadezimales Integer-Literal (Basis sechzehn) beginnt mit 0x oder 0X und besteht aus einer Folge von hexadezimalen Ziffern, die die Dezimalstellen und die Buchstaben a bis f und A bis F mit Dezimalwerten zehn bis fünfzehn enthalten. Beispiel: Die Nummer zwölf kann geschrieben werden 12, 014, 0XC oder 0b1100. Die Literale 1048576, 1048576, 0X100000, 0x100000 und 0004000000 haben alle den gleichen Wert. Ende Beispiel Wikipedia beschreibt, was Endianness ist, und nutzt unser Zahlensystem als Beispiel zu verstehen, Big-Endian. Die Begriffe endian und endianness beziehen sich auf die Konvention, die verwendet wird, um die Bytes zu interpretieren, die ein Datenwort bilden, wenn diese Bytes im Computerspeicher gespeichert sind. Big-Endian-Systeme speichern das bedeutendste Byte eines Wortes in der kleinsten Adresse und das niedrigstwertige Byte wird in der größten Adresse gespeichert (siehe auch das meiste signifikante Bit). Little-endian-Systeme hingegen speichern das niedrigstwertige Byte in der kleinsten Adresse. Ein Beispiel für Endianness ist, zu denken, wie eine Dezimalzahl geschrieben und in Platzwert-Notation gelesen wird. Unter der Annahme eines Schreibsystems, bei dem die Zahlen von links nach rechts geschrieben werden, ist die linke Position analog zu der kleinsten Adresse des verwendeten Speichers und der am weitesten rechts liegenden Position. Zum Beispiel ist die Nummer eins hundert dreiundzwanzig geschrieben 1 2 3, mit den Hunderten Platz links am meisten. Wer diese Nummer liest, weiß auch, dass die linkste Stelle den größten Platzwert hat. Dies ist ein Beispiel für eine Big-Endian-Konvention im täglichen Leben verfolgt. In diesem Zusammenhang betrachten wir eine Ziffer eines ganzzahligen Literals, um ein Byte eines Wortes zu sein, und das Wort, das wörtlich selbst zu sein. Auch der linke Charakter in einem Literal gilt als die kleinste Adresse. Mit dem Literal 1234. Die Ziffern eins, zwei, drei und vier sind die Bytes eines Wortes, und 1234 ist das Wort. Mit dem binären Literal 0b0111. Die Ziffern null, eins, eins und eins sind die Bytes eines Wortes, und das Wort ist 0111. Diese Betrachtung ermöglicht es uns, Endianness im Kontext der C-Sprache zu verstehen und zeigt, dass ganzzahlige Literale dem Big-Endian ähnlich sind. Cmaster Kleinster Adresse links. Natürlich nützen wir gewöhnlich den Begriff endianness für Zahlenstränge überhaupt und nur für das Layout im Gedächtnis. So kann man entweder sagen, dass der Begriff quotendiannessquot überhaupt nicht auf Literale zutrifft, oder dass sie immer großartig sind. Sagen, dass Literale sind immer kleiner Endian ist definitiv falsch. Ndash CodesInChaos Dec 18 14 at 17:22 Du vermisst die Unterscheidung zwischen Endianness wie in den Quellcode und Endianness geschrieben, wie im Objektcode dargestellt. Die Antwort für jeden ist nicht überraschend: Quellcode-Literale sind bigendian, weil das ist, wie Menschen sie lesen, im Objektcode theyre geschrieben aber das Ziel liest sie. Da ein Byte definitionsgemäß die kleinste Speichereinheit ist, glaube ich nicht, dass es möglich wäre, auch eine innere Darstellung von Bits in einem Byte zuzuschreiben - die einzige Möglichkeit, Endianness für größere Zahlen zu entdecken (ob absichtlich oder überraschend) ) Ist durch den Zugriff auf sie aus Speicher stückweise, und das Byte ist per Definition die kleinste zugängliche Speichereinheit. Antwortete am 18.12 um 17:58 Hurkyl genau. Sie können sagen, ob die Maschinenregister groß sind oder nicht, weil diese niemals ausgesetzt sind - es gibt keinen Grund, irgendeine Endianness, aber Großverfügbarkeit in Registern auszusetzen, denn der ganze Punkt von Littlendian war die Kompatibilität mit Soda-Stroh-8-Bit-Datenbussen zur externen Speicherung oder Geräte Ndash jthill Dez 18 14 at 18:23 Die CC-Sprachen interessieren sich nicht für Endianness von Multi-Byte-Integern. CC-Compiler tun. Compiler analysieren Ihren Quellcode und generieren Maschinencode für die jeweilige Zielplattform. Der Compiler speichert im Allgemeinen ganzzahlige Literale auf die gleiche Weise, wie er eine ganze Zahl speichert, so dass die Ziel-CPUs-Befehle direkt das Lesen und Schreiben in den Speicher unterstützen. Der Compiler kümmert sich um die Unterschiede zwischen Zielplattformen, also musst du nicht. Das einzige Mal, wenn Sie sich um die Endlosigkeit sorgen müssen, ist, wenn Sie binäre Werte mit anderen Systemen teilen, die unterschiedliche Byte-Befehle haben. Dann würden Sie die Binärdaten in Byte by Byte lesen und die Bytes im Speicher in der richtigen Reihenfolge für die System, auf dem Ihr Code läuft. Antwortete 18. Dezember 14 um 17:22 TheronWGenaux: Haha, das muss man lustig haben, um zu debuggen Ja, die x86-Prozessoren default, um das nicht ausgerichtete Lesen zu simulieren, das funktioniert (wenn auch langsam) der gleiche Code auf einem anderen Prozessor erzeugt einen Busfehler. Das macht Spaß, wenn man auf x86 kodiert und testet und dann auf eine andere (z. B. eingebettete) CPU entfaltet. Ndash psmears Dec 19 14 at 18:40 Vielleicht möchten Sie über C oder C oder eine andere Sprache als intrinsisch wenig Endian denken (denken Sie an, wie die bitweise Operatoren arbeiten). Wenn der zugrundeliegende HW Big Endian ist, sorgt der Compiler dafür, dass die Daten im Big Endian gespeichert sind (dito für andere Endianness), aber Ihre bitweise Operationen arbeiten, als ob die Daten wenig endian sind. Denken zu erinnern ist, dass, soweit die Sprache betroffen ist, Daten in wenig endian sind. Endianness-bezogene Probleme entstehen, wenn Sie die Daten von einem Typ auf den anderen werfen. Solange du das nicht machst, bist du gut Ich wurde über die Aussage CC-Sprache als intrinsisch wenig Endian befragt, als solches bin ich ein Beispiel, das viele weiß, wie es funktioniert, aber gut hier gehe ich. Ausgabe auf einem kleinen Endian-System: Ausgabe auf einem Big-Endian-System: Also, wenn du die Prozessoren nicht endet. Woher kommt alles richtig im kleinen endianen System Also sage ich, dass die CC-Sprache intrinsisch wenig endian ist. Antwortete Dez 18 14 um 18:17 Kommentare sind nicht für eine ausführliche Diskussion diese Konversation wurde verschoben, um zu plaudern. Ndash bluefeet 9830 Dec 19 14 at 1:25 Man könnte einen ähnlichen Check in einer Assembler-Sprache oder einer anderen Sprache schreiben, die Zeiger hat. Also dieser Code zeigt nur, dass quotlittle-endian ist mehr natürlich als big-endianquot dies doesn39t gelten speziell für CC. Auch das hat absolut nichts über binäre literale in der frage zu tun. Ndash anatolyg Dez 21 14 um 10:35


Comments