2010-04-29 8 views
5

MASSIVE EDIT:C - Convertir long int à chaîne hexagonale signé

J'ai une longue variable de type int que je dois convertir en une chaîne hexadécimale 24bit signé sans le « 0x » au début. La chaîne doit être composée de 6 caractères suivis d'une terminaison de chaîne '\ 0', donc des zéros doivent être ajoutés.

Exemples: [-1 -> FFFFFF] --- [1 -> 000001] --- [71 -> 000047]

Réponse Cela semble faire l'affaire:

long int number = 37; 
char string[7]; 

snprintf (string, 7, "%lX", number); 
+0

Juste pour clarifier, ce que vous voulez dire par hex signé, par ex. À quoi devrait-on être converti? –

+0

FFFFFF (si j'ai fait mon droit de conversion: s) – Cheetah

+0

OK, cela ressemble à la conversion en unsigned long et à l'impression d'un nombre hexadécimal non signé. –

Répondre

8

Parce que vous ne voulez que six chiffres, vous devrez probablement faire un certain masquage pour vous assurer que le nombre est conforme à vos besoins. Quelque chose comme ceci:

sprintf(buffer, "%06lx", (unsigned long)val & 0xFFFFFFUL); 

Sachez que vous mappez tous les entiers longs dans une petite plage de représentations. Vous voudrez peut-être vérifier le nombre est dans une gamme spécifique avant de l'imprimer (par exemple -2^23 < x < 2^23 - 1)

+1

Il s'agit de la seule réponse * complète * actuellement (la conversion en 'unsigned long' est requise). – caf

+0

Qu'est-ce qui détermine le mappage que vous ajoutez? Dites que j'étais après un 32 bits (chaîne de 8 caractères), quelle cartographie ajouteriez-vous alors?(Évidemment, vous changeriez aussi les drapeaux de format à 08) – Cheetah

+0

Effectivement, le mapping est x -> x (mod 2^24), donc les nombres> 2^24 enveloppent. Avec huit caractères, une chaîne de 32 bits, ce serait x -> x (mod 2^32) que ce soit une injection (réversible) dépend de la taille de la longueur de la plateforme en question. –

1

Utilisez itoa. Il prend la base désirée comme argument.

Ou à la réflexion, non. Utilisez sprintf, qui est conforme aux normes.

11

Regardez sprintf. Le spécificateur %lx fait ce que vous voulez.

+2

En outre, vous devriez utiliser 'snprintf' plutôt que' sprintf' si vous le pouvez. – dreamlax

1

Dans le titre, vous dites que vous voulez une chaîne hexadécimale signée, mais tous vos exemples sont des chaînes hexadécimales non signées. En supposant que les exemples sont ce que vous voulez, le plus simple est

sprintf(buffer, "%06X", (int)value & 0xffffff);