2010-12-29 4 views
3

Ich versuche, Basis 16 in Basis 36 zu konvertieren. Ich nehme MD5-Hashes und machen sie alle 0-9a-z.Hexadezimal zu Hexatridecimal in C++

Ich suchte herum und fand nichts Gutes. Irgendwelche Vorschläge für die Konvertierung von Hexadezimal zu Hexatridecimal in C++? Kennst du irgendwelche guten Bibliotheken dafür?

+0

Ich verstehe nicht, die Frage: – ykatchou

+0

$ Wie konvertiere ich 098f6bcd4621d373cade4e832627b4f6 von der Basis konvertieren 16 bis 36 in C++ Basis? – Tech163

+0

Ich poste später C++ - Code, der tut, was Sie wollen, aber in der Zwischenzeit ist dieser Beitrag verwandt: http://stackoverflow.com/questions/3419606/compress-21-alphanumeric-characters-in-to-16-bytes –

Antwort

3

Ich nehme an, der schwierige Teil, mit dem Sie kämpfen, ist die Konvertierung zu Rad36, nicht erhalten einen ganzzahligen Wert von einer Hexadezimalzahl als String dargestellt. Also, hier ist eine Funktion, die eine unsigned __int64, konvertiert es in Radix 36, und gibt eine Zeichenfolge mit dem konvertierten Wert zurück.

string rad36(unsigned __int64 v) 
{ 
    string retval; 
    while(v > 0) 
    { 
     unsigned m = v%36; 
     if(m <= 9) 
      retval.insert(0,1,'0'+m); 
     else 
      retval.insert(0,1,'A'+m-10); 
     v /= 36; 
    } 
    return retval; 
} 
+0

Vielleicht möchten Sie den Rest zurückgeben, damit Anrufe an 'rad36' angekettet werden können. –

+0

@Alexandre C .: Wahrscheinlich eine gute Idee. Ich brauchte das in meiner Bewerbung nicht, also überlasse ich das dem Leser als Übung. :) –

+0

Danke. Ich erhalte den Fehler "error: expected ',' or '...' vor 'v'" in der ersten Zeile. Muss ich etwas hinzufügen, um __int64 zu benutzen? – Tech163

3

Die Basislösung ist Ihre 128-Bit-Zahl in einem (großen) integer konvertieren, dann anschließend Modul und Divisionsoperationen durch 36.en

jedoch durchführen, wenn Sie mit verschwendet ein paar Bits OK sind, Warum nicht zu Base 32 konvertieren, um die Dinge zu vereinfachen? Dann kannst du alles mit Verschieben und Maskieren machen.

+3

Eine andere einfache Idee wäre, base64 zu verwenden; Es hat mehrere Vorteile: es ist weit verbreitet (viele Werkzeuge, um es zu konvertieren), ist leicht zu erkennen, und Sie können die Konvertierung leicht durchführen. –

+1

Base-64 ist auch sehr beliebt (verwendet Ziffern, Groß- und Kleinbuchstaben und ein paar Interpunktion wie Unterstrich und Bindestrich), und es gibt viele Funktionen um diese Konvertierung durchzuführen. –

+0

@John Könnten Sie es erklären? Ich hatte den Eindruck, dass eine der großen Stärken von Base64 darin besteht, dass es Binärdaten in druckbarer ASCII-Form darstellen kann. –