Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   BigEndian-Verwirrungen beim Unicode? (https://www.delphipraxis.net/154793-bigendian-verwirrungen-beim-unicode.html)

himitsu 25. Sep 2010 14:33

BigEndian-Verwirrungen beim Unicode?
 
Bin grade wieder auf was gestoßen, welches mich irgendwie schon ein paar Mal gewundert hatte.

Code:
Codepage 1200 - Unicode (aka UTF-16)
Codepage 1201 - Unicode Big-Endian
Dieses kennen bestimmt Einige?

Delphi-Quellcode:
s := #$FEFF'123';
ergibt
Delphi-Quellcode:
$FF $FE $31 $00 $32 $00 $33 $00 $34 $00
(Speicherauszug).
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.

http://msdn.microsoft.com/en-us/library/dd317756.aspx

Neutral General 25. Sep 2010 14:37

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")

BUG 25. Sep 2010 14:47

AW: BigEndian-Verwirrungen beim Unicode?
 
Zitat:

Zitat von himitsu (Beitrag 1051848)
Delphi-Quellcode:
s := #$FEFF'123';
ergibt
Delphi-Quellcode:
$FF $FE $31 $00 $32 $00 $33 $00 $34 $00
(Speicherauszug).

Kommt mir das nur so vor, oder steht im Speicherauszug noch eine 4 (
Delphi-Quellcode:
s := #$FEFF'1234';
) :)

himitsu 25. Sep 2010 14:48

AW: BigEndian-Verwirrungen beim Unicode?
 
Zitat:

Zitat von Neutral General (Beitrag 1051849)
BigEndian = Höchwertigstes Byte kommt als erstes ;)

Ich sag ja ... also doch falschrum (bei mir)

Ich glaub ich merk mir das nie, solange BigEndian nicht "mit Groß endend" übersetzt :wall:

BUG 25. Sep 2010 14:52

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:

himitsu 25. Sep 2010 14:56

AW: BigEndian-Verwirrungen beim Unicode?
 
Zitat:

Zitat von BUG (Beitrag 1051850)
Kommt mir das nur so vor, oder steht im Speicherauszug noch eine 4 (
Delphi-Quellcode:
s := #$FEFF'1234';
) :)

du merkst aber och alles :lol:
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:

Zitat von BUG (Beitrag 1051852)
... kommt zuerst ...

Endian klingt nunmal nach Ende/Aufwören und nicht nach Anfangen/Zuerst :oops:

SirThornberry 25. Sep 2010 15:33

AW: BigEndian-Verwirrungen beim Unicode?
 
Ich merke es mir ebenso das ich weiß das x86 immer LitteEndian ist und ich mit
Delphi-Quellcode:
PByte(@YourCardinal)
das zurück bekomme was von der Zahl in ein Byte passt.

himitsu 25. Sep 2010 15:40

AW: BigEndian-Verwirrungen beim Unicode?
 
Zitat:

Zitat von SirThornberry (Beitrag 1051867)
das zurück bekomme was von der Zahl in ein Byte passt.

Das ist ja das Problem ... wenn das größere Byte zuerst im Speicher steht, dann müßte man hier eigentlich das HiByte bekommen und nicht LoByte o.O

Satty67 25. Sep 2010 16:21

AW: BigEndian-Verwirrungen beim Unicode?
 
Zitat:

Zitat von Neutral General (Beitrag 1051849)
BigEndian = Höchwertigstes Byte kommt als erstes ;)

$FEFF => FE FF = Big Endian
$FEFF => FF FE = Little Endian

BigEndian, höchstwertiges Byte am Ende dachte ich... also umgekehrt!? (quasi Big Ende)

$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?)

Neutral General 25. Sep 2010 16:41

AW: BigEndian-Verwirrungen beim Unicode?
 
Also.. Nehmen wir mal dieses Zitat von Wikipedia:

Zitat:

Heutige PC-Systeme (x86-kompatible) verwenden Little-Endian.
dazu nehmen wir folgendes Programm:

Delphi-Quellcode:
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.
Und jetzt wissen wir was LittleEndian bedeutet.

Satty67 25. Sep 2010 16:50

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:
Int := $2211;
hat es dann Klick gemacht ;)

Neutral General 25. Sep 2010 16:56

AW: BigEndian-Verwirrungen beim Unicode?
 
Also:

Wert: $ABCD

Höchstwertigstes Byte: $AB

Little Endian (von klein nach groß = "falsch rum"):
Code:
Speicheradresse    Wert
0000               $CD
0001               $AB
Big Endian (von groß nach klein = "richtig rum"):
Code:
Speicheradresse    Wert
0000               $AB
0001               $CD

Satty67 25. Sep 2010 17:04

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 ;) )

himitsu 25. Sep 2010 18:21

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:

Zitat von Satty67 (Beitrag 1051883)
(Doof, aber das Thema hat zum Glück auch andere etwas verwirrt ;) )

praktisch, wenn man es immer mal wieder vergißt und quasi immer dann, wenn man's mal braucht :oops:

implementation 25. Sep 2010 19:28

AW: BigEndian-Verwirrungen beim Unicode?
 
Zitat:

Zitat von himitsu (Beitrag 1051887)
Ja, weil der Größere am Ende ist, heißt es LittleEndian :wall:

Es ist nunmal das vordere Ende gemeint, nicht das hintere :mrgreen:

Big Endian -> groß (MSB) am vorderen Ende
Little Endian -> klein (LSB) am vorderen Ende
:wink:

Daniela.S 25. Sep 2010 20:25

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:

Satty67 25. Sep 2010 20:55

AW: BigEndian-Verwirrungen beim Unicode?
 
Zitat:

Zitat von Daniela.S (Beitrag 1051904)
Die Uhrzeit gibt man in Std.Min.Sec an, ist BigEndian und das Datum Tag.Mon.Jahr ist LittleEndian

Klingt gut, aber in zwei Wochen hat man vergessen, ob Zeit oder Datum Litte/Big war.

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.

SirThornberry 25. Sep 2010 21:25

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 01:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz