4 votes

Est-ce que strtoul n'est pas sûr pour l'endianisme?

Donc je fais une conversion d'une chaîne de caractères en unsigned long en utilisant strtoul sur une machine little endian et big endian. La machine little endian renvoie la valeur correcte, tandis que la machine big endian ne le fait pas. Cette fonction n'est-elle vraiment pas compatible avec les machines big endian? Si c'est le cas, existe-t-il une solution de contournement?

Code:

printf ("%s\n",cLongs);
theLongs[i] = strtoul(cLongs, NULL, 10);
cout << "valeur unsigned long retournée à partir de la chaîne de caractères: " << theLongs[i] << endl;

Résultat en little endian:

1099188638048931
valeur unsigned long retournée à partir de la chaîne de caractères: 1099188638048931

Résultat en big endian:

1099188638048931
valeur unsigned long retournée à partir de la chaîne de caractères: 4294967295

P.S. Il semble que le même nombre soit toujours retourné pour l'exemple en big endian.

4voto

0xC0000022L Points 9130

strtoul renvoie ULONG_MAX en cas de dépassement. C'est ce sur quoi vous tombez. Je suppose que l'un fonctionne sur 32bits et l'autre sur 64bits en plus des différences de boutisme. 4294967295 == 0xFFFFFFFF, ce qui pour une machine 32 bits serait ULONG_MAX.


Essayez si cela fonctionne pour vous sur les deux systèmes. Je n'ai pu le tester que sur un Linux 64bits Little Endian jusqu'à présent. Si tel est le cas, vous pouvez utiliser des flux de chaînes pour la conversion (ce qui est de toute façon le style C++ pour faire les choses) :

#include 
#include 

int main()
{
  using namespace std;
  string sval("1099188638048931"); // votre grande valeur, dépassant 32 bits
  istringstream sst(sval); // assigner la chaîne à un flux
  unsigned long long myval;
  sst >> myval; // convertir le flux en entier non signé 64 bits
  cout << myval << endl; // afficher le résultat converti
  return 0;
}

Notez que unsigned long long devrait être unsigned __int64 avec MSVC. D'autres compilateurs peuvent avoir d'autres noms. Si vous avez de la chance, vous aurez des types standard sur toutes vos plates-formes et pourrez utiliser uint64_t ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X