base64, um die guid zu base64
Ich bin derzeit forscht MongoDb als eine mögliche Datenbank option, und ich habe Probleme beim Umgang mit Guid-Serialisierung. Ich dachte zuerst vielleicht war das ein Fehler in der C# - Treiber ist die Serialisierung, aber jetzt denke ich, es ist wahrscheinlich eher eine naive Annahme meinerseits.
Mir zu helfen, konvertieren Sie das Bson-base64-Darstellungen hin und her zu Guids, ich schrieb ein paar kleine powershell-Funktionen, um zu helfen:
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$hex = "";
foreach ($x in $b) {
$hex += $x.ToString("x2");
}
$g = new-object -TypeName System.Guid -ArgumentList $hex;
return $g;
}
function guidtobase64
{
param($str);
$g = new-object -TypeName System.Guid -ArgumentList $str;
$b64 = [System.Convert]::ToBase64String($g.ToByteArray());
return $b64;
}
Ein Beispiel für das Problem, das ich habe:
:) guidtobase64("53E32701-9863-DE11-BD66-0015178A5E3C");
ASfjU2OYEd69ZgAVF4pePA==
:) base64toguid("ASfjU2OYEd69ZgAVF4pePA==");
Guid
----
0127e353-6398-11de-bd66-0015178a5e3c
Und aus der mongo-shell:
:) mongo
MongoDB shell version: 1.6.5
connecting to: test
> b = new BinData(3, "ASfjU2OYEd69ZgAVF4pePA==");
BinData(3,"ASfjU2OYEd69ZgAVF4pePA==")
> b.hex();
127e353639811debd66015178a5e3c
>
So, wie Sie sehen können, ist die Guid bekomme ich wieder nicht mit dem übereinstimmt, was ich in. Meine Funktion hex() das gleiche zurückgeben. Vergleicht man das original zu dem Ergebnis:
53E32701-9863-DE11-BD66-0015178A5E3C
0127e353-6398-11de-bd66-0015178a5e3c
Können Sie sehen, dass die ersten 3 Sätze von hex-Paare sind vertauscht, aber die letzten 2 Sätze sind es nicht. Das macht mich denke, es ist etwas über die Guid.ToString (), dass ich nicht verstehe.
Kann jemand klärt mich auf bitte?
- welche Sprache ist das?
- Die Skripte in der Powershell. Der Grund, warum ich verwendet, die Zeichenfolge ist, weil ich nicht herausfinden konnte, wie übergeben Sie die byte-array mit " - ArgumentList.
- Das ist es, was mir fehlte, die Magische Komma. Jeden Tag etwas neues lernen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Reihenfolge der bytes in einer GUID sind nicht das gleiche wie die Reihenfolge, in der Ihre
ToString()
Darstellung auf little-endian Systemen.Sollten Sie verwenden guid.ToByteArray() anstatt ToString().
Und verwenden, sollten Sie
new Guid(byte[] b)
zu konstruieren, anstatt$str
.Ausdrücken in reines C#:
Werfen Sie einen Blick auf die "Grundlegende Struktur" Abschnitt der GUID Artikel auf Wikipedia weitere details.
Werden Sie sehen, dass die meisten Daten in "Native" endianness... das ist, wo die Verwirrung herkommt.
Zitieren:
Edit:
Powershell-version:
Als eine zusätzliche Vorsichtsmaßnahme, können Sie Optional schneiden Sie die "==" off der Ende des Strings, da ist es nur Polsterung (was kann helfen, wenn Sie versuchen, um Platz zu sparen).
Müssen Sie rufen Sie die Guid-Konstruktor, der ein byte-array. Es gibt spezielle syntax benötigt, die in der Powershell, wenn Sie nur pass $b es wird Ihnen sagen, Sie es nicht finden können, ein Konstruktor, 16 Argumente, so müssen Sie wickeln Sie das byte-array in ein anderes array:
Blick auf die c-sharp Treiber-Dokumentation auf die mongo-website, es stellt sich heraus, dass es eine implizite Konvertierung vorgesehenen System.Guid.
So, in c# (sorry, mein powershell ist ein wenig eingerostet), würden Sie einfach schreiben:
Ich kann mir vorstellen, dass die Umkehrung wird wahrscheinlich auch funktionieren:
Wenn Sie keine speziellen Anforderungen an die Serialisierung der Guid als base64, dann konvertieren direkt in das binary wird viel weniger Arbeit (beachten Sie, dass es keine endian Probleme, zum Beispiel). Auch, die Daten werden in Binär auf den server, so wird es sein, mehr Raum effizienter als die Verwendung von base64.