Façon d'obtenir unsigned char dans un std::string sans reinterpret_cast?
J'ai un unsigned char tableau que j'ai besoin dans un std::string, mais ma façon actuelle utilise reinterpret_cast que je voudrais éviter. Est-il une manière plus propre de faire cela?
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);
- Et pourquoi vous n'aimez pas
reinterpret_cast
...? - Il semble toujours comme un hack pour forcer un casting, je préfère utiliser des choses comme l'est plutôt que de forcer le compilateur à les traiter comme quelque chose d'autre.
- Pourquoi ne pas utiliser
char
pourmy_txt
; après tout, ces valeurs sont affichées au format ASCii. Cela peut conduire à la résolution d'autres problèmes. - C'est un fichier généré, donc je préfère ne pas avoir à traiter.
- L'initialisation d'un
string
deunsigned char*
semble assez raisonnable pour moi. Je suis surprise de voir que quelqu'un a une objection à vouloir le faire sans l'aide d'un plâtre.
Vous devez vous connecter pour publier un commentaire.
Utiliser l'itérateur constructeur:
C'est en supposant que vous souhaitez unsigned caractères pour être converti en char. Si vous voulez à être réinterprété, alors vous devriez utiliser
reinterpret_cast
. Ce serait parfaitement propre, car ce que vous dites est exactement ce qui est fait.Dans votre exemple, si, il ne fait aucune différence, parce que toutes les valeurs du tableau sont dans la gamme
0
àCHAR_MAX
. Il est donc garanti que ces valeurs sont représentées de la même manière danschar
comme ils sont dansunsigned char
, et, par conséquent, que les réinterpréter est le même que pour la convertir. Si vous avait des valeurs supérieures àCHAR_MAX
puis implémentations sont autorisés à les traiter différemment.CHAR_MAX
char de la mise en œuvre est définie. Le résultat de la réinterprétation, dépend de la valeur de la représentation des types, et n'est pas garanti d'être le même que la conversion.string
poignées.Avez-vous essayé de succession?