Question

Ceci est un double presque exacte de ma propre question, il y a quelques semaines.

Convertir en décimal Hex lorsque pas de type peut contenir le numéro complet

Cette fois-ci, il est l'inverse. Je le numéro (dans une chaîne à zéro terminal à portée de main) et j'ai besoin les octets qui font de ce numéro. Cependant, je travaille dans une architecture 32 bits pour un micro-contrôleur, donc je n'ai pas la possibilité d'utiliser le atoi, car le nombre est supérieur à 32 bits.

Est-ce que quelqu'un a une idée sur la façon d'inverser l'algorithme prévu dans le premier lien, pour retourner le résultat initial? Mes modulo compétences arithmétiques me parviennent pas.

Exemple rapide: 155.207.231.135 0x [24] [23] [12] [66] [9F] (les crochets séparent les octets)

Était-ce utile?

La solution

Vous pouvez faire quelque chose de similaire à la division BigInt.

a = atoi of lower 7 decimal digits
b = atoi of remaining upper decimal digits


for (int i = 0; i < 5; i++)
{
    a += 10000000 * (b % 256);
    b /= 256;
    Result[i] = a % 256;
    a /= 256;
}

Autres conseils

Vous aurez besoin d'assembleur pour celui-ci. Pseudocode:

int low = 0 // lower 32 bit
int high = 0 // higher 32 bit

for (int i=0; i<string.length(); i++) {
    int digit = string.get(i) - '0';
    int a = low;
    int b = high;
    a <<= 1; b += overflow;             // *2
    a <<= 1; b += overflow;             // *4
    a += low; b += overflow; b += high; // *5
    a <<= 1; b += overflow;             // *10
    a += digit; b += overflow;          // +digit
    low = a; high = b;
}

Donc, fondamentalement, vous créez un registre de 64 bits en utilisant deux ints 32bit. Pour chaque boucle, vous:

    value *= 10 + digit;

Par la suite, il vous suffit de sauter les octets 0 au début de la valeur résultante pour obtenir les octets que vous cherchez.

Il suffit d'analyser la chaîne de gauche à droite, en multipliant le résultat précédent par dix et en ajoutant le chiffre.

Voici un code en C # pour afficher le concept. Les deux premières méthodes pour des mathématiques sur un tableau:

static void Mul(byte[] data, int num) {
   int n = 0;
   for (int i = data.Length - 1; i >= 0; i--) {
      n += (int)data[i] * num;
      data[i] = (byte)n;
      n >>= 8;
   }
}

static void Add(byte[] data, int num) {
   for (int i = data.Length - 1; num > 0; i-- ) {
      num += (int)data[i];
      data[i] = (byte)num;
      num >>= 8;
   }
}

Alors vous faites juste:

string s = "155207231135";
byte[] result = new byte[16];
foreach (char c in s) {
   Mul(result, 10);
   Add(result, c - '0');
}

Le résultat est dans le réseau de result, complétées avec des zéros à gauche.

Il ne devrait pas abeille difficile à traduire à C ...:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top