AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GUID - Warum diese Darstellung als String

Ein Thema von bernau · begonnen am 19. Mär 2020 · letzter Beitrag vom 20. Mär 2020
 
Benutzerbild von himitsu
himitsu

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

AW: GUID - Warum diese Darstellung als String

  Alt 20. Mär 2020, 11: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;
Ein Therapeut entspricht 1024 Gigapeut.

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:10 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 by Thomas Breitkreuz