Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#10

AW: GUID - Warum diese Darstellung als String

  Alt 20. Mär 2020, 10:34
Zitat:
Das Format mit den Minuszeichen kommt vom Inhalt..
Jupp, denn die Bindestriche, bzw. die Trennzeichen sind extrem wichtig, da die Byteorder zu beachten ist,
weil die Reihenfolge der Bytes im Speicher (Little-Endian > BinToHex) nicht mit den decodierten Werten (IntToHex > Big-Endian) übereinstimmt. (außer im alten MacOS)

Code:
LongWord Word Word Byte-Array
01234567-89AB-CDEF-0123-456789ABCDEF
67452301 AB89 EFCD 0123 456789ABCDEF
zum Selbstausprobieren
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  G: TGUID;
  S, B: string;
begin
  S := '01234567-89AB-CDEF-0123-456789ABCDEF';
  G := StringToGUID('{' + S + '}');

  SetLength(B, SizeOf(G) * 2);
  BinToHex(G, PChar(B), SizeOf(G));
  Insert(' ', B, 21);
  Insert(' ', B, 17);
  Insert(' ', B, 13);
  Insert(' ', B, 9);

  ShowMessage(S + sLineBreak + B);
end;
Ich werde wohl nur einfach nie kappieren, warum der vorletzte Block kein Word und somit nicht auch umgedreht wird,
jedenfalls nicht dank der aktuellen Typdefinition, wo ich's einfach beim kurz Hingucken immer überseh.
Delphi-Quellcode:
  TGUID = packed record
    D1: LongWord;
    D2: Word;
    D3: Word;
  //D4: array[0..7] of Byte; // von Microsoft/Delphi
    D4: array[0..1] of Byte; // meine Interpretation
    D5: array[0..5] of Byte; // ...
  end;
Zitat:
Sind 6 Byte in einem String, die eigentlich absolut sinnlos sind. Eine Speicherung ohne diese Zeichen würde doch nichts an der Eindeutigkeit ändern.
Dann speichere es binär und es ist nochmal die Hälfte an Bytes. Bei Unicode sogar nur ein Viertel.
Sogar viele Datenbanken bieten einen GUID-Typ, um es direkt formatunabhängig zu speichern und optimaler zu suchen.

Selbst der Delphi-Compiler bietet diese automatische Konvertierung schon seit Jahrzehnten, zumindestens teilweise bei Interfaces und Konstanten.
Delphi-Quellcode:
const
  C: TGUID = '{01234567-89AB-CDEF-0123-456789ABCDEF}'; // hier ja

procedure TForm1.FormCreate(Sender: TObject);
var
  G: TGUID;
begin
  G := '{01234567-89AB-CDEF-0123-456789ABCDEF}'; // aber hier nicht :roll:
  G := TGUID('{01234567-89AB-CDEF-0123-456789ABCDEF}'); // und so auch nicht
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (20. Mär 2020 um 10:47 Uhr)
  Mit Zitat antworten Zitat