L'initialisation d'un unsigned char tableau avec des valeurs hexadécimales en C++
Je voudrais initialiser un unsigned char tableau avec 16 valeurs hexadécimales. Cependant, je n'ai pas l'air de savoir comment initialiser correctement/accéder à ces valeurs. Lorsque je tente d'y accéder que je veuille intuitivement, je suis arriver a aucune valeur.
C'est ma sortie
The program was run with the following command: 4
Please be a value! -----> p
Here's some plaintext
lors de l'exécution avec le code ci-dessous -
int main(int argc, char** argv)
{
int n;
if (argc > 1) {
n = std::stof(argv[1]);
} else {
std::cerr << "Not enough arguments\n";
return 1;
}
char buff[100];
sprintf(buff,"The program was run with the following command: %d",n);
std::cout << buff << std::endl;
unsigned char plaintext[16] =
{0x0f, 0xb0, 0xc0, 0x0f,
0xa0, 0xa0, 0xa0, 0xa0,
0x00, 0x00, 0xa0, 0xa0,
0x00, 0x00, 0x00, 0x00};
unsigned char test = plaintext[1]^plaintext[2];
std::cout << "Please be a value! -----> " << test << std::endl;
std::cout << "Here's some plaintext " << plaintext[3] << std::endl;
return 0;
}
En contexte, c'est la partie d'un groupe projet pour l'école. Nous sommes finalement en essayant de mettre en œuvre le Serpent de chiffrement, mais continuer à se fauché par unsigned char tableaux. Notre projet de spécification dit que nous devons avoir deux fonctions qui prennent ce serait tableaux d'Octets en Java. Je suppose que le plus proche parent en C++ est un unsigned char[]. Sinon, je voudrais utiliser le vecteur. Ailleurs dans le code que j'ai mis en place un setKey fonction qui prend un unsigned char tableau, les packs de ses valeurs, 4 long ints (la clé doit être de 256 bits) et effectue divers de décalage de bits et xor opérations sur les entiers pour générer les clés nécessaires à l'algorithme de chiffrement. J'espère que c'est assez de fond sur ce que je cherche à faire. Je suppose que je suis juste surplombant quelques notions de C++ fonctionnalité ici. Merci pour toute aide!
- Quel est donc le problème?
- utiliser la conversion pour convertir votre char d'entrée en usnsigned char..
- l'impression d'un
unsigned char
aveccout
imprime le caractère ASCII par défaut. Si vous voulez juste pour imprimer la valeur, faites ceci:std::cout<<std::hex<<static_cast<unsigned int>(test)<<std::endl;
std::stof
convertit une chaîne en une valeur en virgule flottante. vouliez-vous direstd::stod
?
Vous devez vous connecter pour publier un commentaire.
Un
char
est une valeur de 8 bits capable de stocker -128 <= n <= +127, fréquemment utilisé pour stocker des caractères des représentations dans les différents encodages et communément dans l'Ouest, Romain-alphabet installations -char
est utilisé pour indiquer la représentation de l'ASCII ou utf codé valeurs. "Encodée" signifie les symboles/lettre dans le jeu de caractères ont été affectés à des valeurs numériques. Pensez à la table périodique comme un codage des éléments, de sorte que H (Hydrogène) est codée sous la forme 1, le Germanium comme 32. En ASCII (et UTF-8) tables, la position 32 représente le caractère que nous appelons "espace".Lorsque vous utilisez
operator <<
sur un char de la valeur, le comportement par défaut est de supposer que vous êtes de passage à un codage de caractères, par exemple, un code de caractère ASCII. Si vous neTous les quatre affectations sont équivalentes. 'z' est un raccourci/syntaxique de sucre pour
char(122)
,0x7A
est hex pour 122, et '\x7a' est une évasion qui forme le caractère ascii avec une valeur de 0x7a ou 122 - c'est à dire z.Où de nombreux nouveaux programmeurs vont mal, c'est qu'ils le font:
ce n'imprime pas "8", il affiche le caractère ASCII à la position 8 dans la table ASCII.
Pense que pour un moment:
Permet de rembobiner un moment: lorsque vous stockez
120
dans une variable, il peut représenter le caractère ASCII'x'
, mais en fin de compte ce qui est enregistré est juste la valeur numérique120
, pure et simple.Plus précisément: Lorsque vous passez
122
à une fonction qui va en fin de compte l'utiliser pour rechercher une police à l'entrée d'un jeu de caractères à l'aide de la Latin1, ISO-8859-1, UTF-8 ou similaire encodages, puis120
signifie'z'
.À la fin de la journée,
char
est juste un de la norme entier types de valeur, il peut stocker des valeurs-128 <= n <= +127
, il peut trivialement être promu à unshort
,int
,long
oulong long
, etc, etc.Alors qu'il est généralement utilisé pour désigner les personnages, il est également souvent utilisé comme un moyen de dire "je ne suis qu'à stocker des valeurs très faibles" (telles que le nombre entier pourcentages).
Si vous souhaitez imprimer la valeur numérique, il vous suffit de le promouvoir à un autre type de valeur:
ou le préféré C++ façon
char
peut certainement stocker des valeurs de 0 à 127. Tout le reste est de la mise en œuvre définies.Je pense (c'est pas tout à fait claire de ce que vous demandez) que la réponse est aussi simple que cela
Si vous voulez à la sortie de la valeur numérique d'un char ou unsigned char, vous devez le convertir en un int ou unsigned premier.
Il n'est pas surprenant, par défaut, les caractères en sortie sont des caractères qui ne sont pas des entiers.
BTW, ce funky code
est plus simplement écrit que
std::cout
etstd::cin
traite toujours variable char comme un charSi vous voulez d'entrée ou de sortie comme int, vous devez faire comme ci-dessous.
Si l'utilisation de scanf ou printf, il n'existe pas un tel problème que le paramètre de format ("%d", "%c", "%s") raconte howto secrète de la mémoire tampon d'entrée (integer, char, string).