![]() |
BigEndian-Verwirrungen beim Unicode?
Bin grade wieder auf was gestoßen, welches mich irgendwie schon ein paar Mal gewundert hatte.
Code:
Dieses kennen bestimmt Einige?
Codepage 1200 - Unicode (aka UTF-16)
Codepage 1201 - Unicode Big-Endian
Delphi-Quellcode:
ergibt
s := #$FEFF'123';
Delphi-Quellcode:
(Speicherauszug).
$FF $FE $31 $00 $32 $00 $33 $00 $34 $00
Dieses entspricht der Codepage 1200 und wenn man genau hinguckt, dann ist das doch BigEndian, denn die höherwertige Bytes kommen als Letztes. :gruebel: Was ist also nun richtig? Ich komme zwar ständig beim Windows durcheinander, also ob der Integer Big- oder LitleEndian ist, also k.A. und vielleicht bin ich auch nur schonwieder falsch. ![]() |
AW: BigEndian-Verwirrungen beim Unicode?
BigEndian = Höchwertigstes Byte kommt als erstes ;)
$FEFF => FE FF = Big Endian $FEFF => FF FE = Little Endian Prinzipiell sind bei x86 CPUs alle Daten(typen) LittleEndian. (Es sei denn man speichert sie explizit "falschrum") |
AW: BigEndian-Verwirrungen beim Unicode?
Zitat:
Delphi-Quellcode:
) :)
s := #$FEFF'1234';
|
AW: BigEndian-Verwirrungen beim Unicode?
Zitat:
Ich glaub ich merk mir das nie, solange BigEndian nicht "mit Groß endend" übersetzt :wall: |
AW: BigEndian-Verwirrungen beim Unicode?
Das dicke Ende (der Zahl) kommt zuerst ...
... ich merke es mir tatsächlich so, das ich weiß, das mein PC LittleEndian ist und dort die Zahlen "falsch herum" im Speicher liegen :stupid: |
AW: BigEndian-Verwirrungen beim Unicode?
Zitat:
das war die von Hand gekürzte Variante von
Delphi-Quellcode:
.
#$FEFF'1234567'
Wo ich wohl ein bissl falsch gekürzt und abgeschrieben hab. Blöd halt, denn man kann sich die "angezeigten" Werte der überwachten Variablen immernoch nicht kopieren. Zitat:
|
AW: BigEndian-Verwirrungen beim Unicode?
Ich merke es mir ebenso das ich weiß das x86 immer LitteEndian ist und ich mit
Delphi-Quellcode:
das zurück bekomme was von der Zahl in ein Byte passt.
PByte(@YourCardinal)
|
AW: BigEndian-Verwirrungen beim Unicode?
Zitat:
|
AW: BigEndian-Verwirrungen beim Unicode?
Zitat:
$1234 => 34 12 = Big Endian $1234 => 12 34 = Little Endian €: Nachgeschaut: BigEndian, höchstwertigstes Byte an der höchsten Speicheradresse. Also im Stream am Ende ankommend? LittleEndian, höchstwertiges Byte kommt an erster Speicheradresse, als erstes aus dem Stream, mit niedrigsten Index im String... (bin mir so langsam fast sicher) (irgendwie glaube ich, Beschreibung richtig, Darstellung falsch umd bei NG umgekehrt?) |
AW: BigEndian-Verwirrungen beim Unicode?
Also.. Nehmen wir mal dieses Zitat von Wikipedia:
Zitat:
Delphi-Quellcode:
Und jetzt wissen wir was LittleEndian bedeutet.
program Project1;
{$APPTYPE CONSOLE} uses SysUtils; var Int: Word; B: PByte; begin Int := $ABCD; writeln('Wert: $ABCD'); write('Speicher: '); B := @Int; write('$',IntToHex(B^,2),', '); inc(B); write('$',IntToHex(B^,2)); readln; end. |
AW: BigEndian-Verwirrungen beim Unicode?
Ich glaube Deine Darstellung war richtig, aber deine Beschreibung: "BigEndian = Höchwertigstes Byte kommt als erstes" passt doch nicht?
Auf der Wiki-Seite ist das höherwertige Byte bei BigEndian an der höchsten Speicheradresse, also als letztes? Ich hab's jetzt... mich hat verwirrt, das im Beispiel das niederwertige Byte den größten Byte-Wert hatte. mit Deinem Beispiel und
Delphi-Quellcode:
hat es dann Klick gemacht ;)
Int := $2211;
|
AW: BigEndian-Verwirrungen beim Unicode?
Also:
Wert: $ABCD Höchstwertigstes Byte: $AB Little Endian (von klein nach groß = "falsch rum"):
Code:
Big Endian (von groß nach klein = "richtig rum"):
Speicheradresse Wert
0000 $CD 0001 $AB
Code:
Speicheradresse Wert
0000 $AB 0001 $CD |
AW: BigEndian-Verwirrungen beim Unicode?
Ja, siehe mein Edit... hatte die ganze Zeit zu sehr auf die größeren Einzel-Byte-Werte geschaut und dadurch ständig höherwertiges Byte mit höchstem Einzelwert gleichgesetzt.
(Doof, aber das Thema hat zum Glück auch andere etwas verwirrt ;) ) |
AW: BigEndian-Verwirrungen beim Unicode?
Ja, weil der Größere am Ende ist, heißt es LittleEndian :wall:
wer soll sich denn sowas merken :( Also im Speicher ist es LittleEndian (klein..groß) und als Integer im Quellcode nutzen wir BigEndian (groß..klein). Zitat:
|
AW: BigEndian-Verwirrungen beim Unicode?
Zitat:
Big Endian -> groß (MSB) am vorderen Ende Little Endian -> klein (LSB) am vorderen Ende :wink: |
AW: BigEndian-Verwirrungen beim Unicode?
Himi, merks dir doch einfach so...
Als erstes Byte, also an der niedrigsten Speicherstelle wird... das höchstwertige Byte (BigEndian) das niederwertigste Byte (LittleEndian) gespeichert. Oder vielleicht mit Alltagsphänomenen... Die Uhrzeit gibt man in Std.Min.Sec an, ist BigEndian und das Datum Tag.Mon.Jahr ist LittleEndian :roll: |
AW: BigEndian-Verwirrungen beim Unicode?
Zitat:
In Hochsprachen braucht man sowas einfach zu selten. Das Consolen-beispiel von eNGi hab' ich einfach in mein Beispiel-Folder... in x Wochen schaue ich einfach nach. |
AW: BigEndian-Verwirrungen beim Unicode?
Ich denke die Verwirrung wird dadurch erzeugt das man beim shiften von Bits immer die BigEndian Darstellung verwendet. LittleEndian ist definitiv so das die niederwertigsten Bytes Speicheradressmäßig vor den höherwertigen Bytes kommen.
Bei LittleEndian ist ein LinksShiften eigentlich ein Shiften nach Rechts wenn man davon ausgeht das die niedrigere Speicheradresse links steht und rechts die höhere Speicheradresse. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz