MASSIVE EDIT: strong> J'ai une longue variable INT que j'ai besoin de convertir en une chaîne hexadécimale 24 bits signée sans le "0x" au début. La chaîne doit être de 6 caractères suivie d'un terminateur à chaîne '\ 0', de sorte que les zéros de pointe doivent être ajoutés. P> Exemples:
[-1 -> FFFFFF] ---
[1 -> 000001] ---
[71 -> 000047] P> réponse strong>
Cela semble faire l'astuce: p>
4 Réponses :
Utilisez ou sur la deuxième pensée, non. Utilisez itoa code>. Il faut la base désirée comme argument. P>
sprintf code>, qui est conforme à la normalisation. P>
regarder sprintf code>. Le spécificateur
% lx code> fait ce que vous voulez. P>
En outre, vous devez utiliser snprintf code> plutôt que
sprintf code> si vous le pouvez.
Parce que vous ne voulez que six chiffres, vous devrez probablement faire du masquage pour vous assurer que le nombre est tel que vous en avez besoin. Quelque chose comme ceci:
sprintf(buffer, "%06lx", (unsigned long)val & 0xFFFFFFUL);
C'est la seule complète i> la réponse en ce moment (la conversion vers non signé long code> est requise).
Qu'est-ce qui détermine quelle cartographie vous appelle? Dis que j'étais après une chaîne de caractères 32bits (8 de caractères), quelle mappage ajouteriez-vous alors? (Évidemment, vous changeriez les drapeaux de format vers 08)
Effectivement, le mappage est x -> x (mod 2 ^ 24), donc les nombres> 2 ^ 24 enveloppements autour. Avec huit caractères, 32 bits string, il serait x -> x (MOD 2 ^ 32) s'il s'agit d'une injection (réversible) dépend de la taille de la taille de la plate-forme non signée sur la plate-forme en question.
Dans le titre, vous dites que vous voulez une chaîne hexagonale signée, mais tous vos exemples sont des chaînes hexagonales non signées. En supposant que les exemples sont ce que vous voulez, le moyen le plus simple est
Juste pour des éclaircissements, ce que vous voulez dire par SIGNÉ HEX, E.G. Que devrait-on convertir -1?
Ffffff (si j'ai fait ma conversion à droite: s)
OK, cela ressemble à une conversion sur un nombre non signé et imprimant un numéro hexagonal non signé.
Donc, vous voulez réellement une chaîne hexagonale 24 bits?
Deux autres questions ... est votre tampon de sortie de charcuterie 6 caractères ou 6 caractères plus i> une résiliation zéro? De plus, voulez-vous que 1 se convertir en '1 \ 0' ('1' suivi d'un charnel de caractères) ou de '1' (c'est censé être 5 espaces puis un '1') ou à '000001'?
La conversion
% lx code> nécessite un
non signé long code> mais vous le transmettez un
long code>. Bien que cela fonctionne pour vous aussi, c'est, une distribution à
non signée longue code> est requise pour une correction formelle. Votre méthode actuelle donnera également les mauvaises valeurs pour la plupart des nombres négatifs - par exemple, essayer -256.
Votre absolument raison, il ne semble pas fonctionner correctement pour des nombres négatifs. Il semble y avoir beaucoup de parler de «masquage» dans les réponses. Comment ça marche exactement? Je suis en train de convoquer des chaînes hexagonales signées 24 et 32 bits, j'utiliserais différents masques pour chacun? Comment puis-je savoir quel masque à utiliser (parce que les gens fournissent des réponses différentes)? Merci.