web-dev-qa-db-fra.com

Manière d'obtenir un caractère non signé dans un std :: string sans reinterpret_cast?

J'ai un tableau de caractères non signé dont j'ai besoin dans std :: string, mais ma méthode actuelle utilise reinterpret_cast, ce que j'aimerais éviter. Y a-t-il une manière plus propre de faire ceci?

unsigned char my_txt[] = {
  0x52, 0x5f, 0x73, 0x68, 0x7e, 0x29, 0x33, 0x74, 0x74, 0x73, 0x72, 0x55
}
unsigned int my_txt_len = 12;

std::string my_std_string(reinterpret_cast<const char *>(my_txt), my_txt_len);
17
WilliamKF

Utilisez le constructeur itérateur:

std::string my_std_string(my_txt, my_txt + my_txt_len);

Cela suppose que vous voulez que les caractères non signés soient convertis en caractères. Si vous voulez que leur soit réinterprété, vous devriez alors utiliser reinterpret_cast. Ce serait parfaitement propre, puisque ce que vous dites est exactement ce qui est fait.

Dans votre exemple, cependant, cela ne fait aucune différence, car toutes les valeurs de votre tableau sont comprises entre 0 et CHAR_MAX. Il est donc garanti que ces valeurs sont représentées de la même manière dans char qu’elles le sont dans unsigned char, et donc que les réinterpréter équivaut à les convertir. Si vous aviez des valeurs supérieures à CHAR_MAX, les implémentations sont autorisées à les traiter différemment.

19
Steve Jessop

Avez-vous essayé le sstream?

     stringstream s;
     s << my_txt;

     string str_my_txt = s.str();
7
  int _tmain(int argc, _TCHAR* argv[])
  {
        unsigned char temp  = 200;
        char temp1[4];

        sprintf(temp1, "%d", temp);

        std::string strtemp(temp1);

        std::cout<<strtemp.c_str()<<std::endl;

        return 0;
   }
0
Praveer Kumar