2013-08-02 1 views
2

Je suis en train d'écrire une classe en C# qui convertit un grand nombre (format string) à tout système de nombre, je trouve ce code à How to convert a gi-normous integer (in string format) to hex format? (C#)Converter numérique (grands Les entiers au format string)

var s = "843370923007003347112437570992242323"; 
    var result = new List<byte>(); 
    result.Add(0); 
    foreach (char c in s) 
    { 
     int val = (int)(c - '0'); 
     for (int i = 0 ; i < result.Count ; i++) 
     { 
      int digit = result[i] * 10 + val; 
      result[i] = (byte)(digit & 0x0F); 
      val = digit >> 4; 
     } 
     if (val != 0) 
      result.Add((byte)val); 
    } 

    var hex = ""; 
    foreach (byte b in result) 
     hex = "ABCDEF"[ b ] + hex; 

Cette code fonctionne aussi pour n'importe quel système numérique (2^n base) avec quelques modifications au code.

Le problème est que je ne comprends pas la logique de l'algorithme (l'instruction for). Quelqu'un peut-il s'il vous plaît expliquer cette partie du code:

for (int i = 0 ; i < result.Count ; i++) 
{ 
    int digit = result[i] * 10 + val; 
    result[i] = (byte)(digit & 0x0F); 
    val = digit >> 4; 
} 
if (val != 0) 
    result.Add((byte)val); 

Afin de rendre ce code pour convertir, par exemple, une décimale de chaîne à une base64 de chaîne, je dois changer le masque de sorte qu'il peut calculer six bits , au lieu de seulement quatre pour le système hexadécimal, puis de droite-shift chiffre de 6 pour ajouter l'octet restant à l'octet suivant.

result[i] = (byte)(digit & 0x03F); 
val = digit >> 6; // 2^6 = 64 

et, enfin, il suffit de changer le look-up table pour imprimer le résultat

hex = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" [ b ] + hex; 

Il est cette ligne dans la boucle for celle que je ne comprends pas tout à fait

int digit = result[i] * 10 + val; 

Qu'est-ce que cette ligne, avec la boucle, fait à chaque itération pour chaque octet de résultat? et surtout, pourquoi?

+1

Sorte de comprendre. Disons que la chaîne était juste '8'. Alors digit = 8, résultat [i] = 8, val = 0, pas d'octet ajouté => 8 (1 octet). Le prochain char est 4; le chiffre est 84, le résultat [0] est 5, le val est 4 => 54 (2 octets). – Jiminion

+0

54 hex est 84 décimal. – Jiminion

+1

Bienvenue dans [donc]. J'ai upvoted, pourquoi downvotes les gens? et pourquoi la clôture comme hors-sujet, c'est une question sur 'un algorithme de logiciel'? –

Répondre

3

Peut-être que le code est plus facile à comprendre si vous comparez l'algorithme à la version plus simple où l'entier peut être représenté dans un int. Ensuite result serait un entier de 32 bits qui vous initialiser à 0 et pour chaque chiffre que vous multipliez la valeur existante de result avec 10 et ajouter le chiffre suivant:

int result = 0; 
foreach (char c in s) { 
    int val = (int)(c - '0'); 
    result = 10*result + val; 
} 

Pour les grands entiers dont vous avez besoin d'un tableau d'octets représente l'entier et la boucle que vous voulez comprendre est un moyen de multiplier la valeur dans le tableau d'octets de longueur inconnue avec 10 tout en ajoutant également la valeur du chiffre. Parce que multiplier par 10 n'est pas un simple changement de bit, vous avez besoin de ce code supplémentaire.