2010-04-29 4 views
5

MASSIVE EDIT:C - Konvertieren long int unterzeichnet Hex-String

Ich habe eine lange int Variable, die ich brauche, um ein signiertes 24-Bit-Hexadezimalstring ohne "0x" am Anfang zu konvertieren. Der String muss aus 6 Zeichen bestehen, gefolgt von einem String-Terminator '\ 0', daher müssen führende Nullen hinzugefügt werden.

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

Antwort Diese den Trick zu tun scheint:

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

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

Nur zur Klarstellung, was Sie meinen mit Vorzeichen hex, z. Was sollte -1 konvertiert werden? –

+0

FFFFFF (wenn ich mein Konvertierungsrecht gemacht habe: s) – Cheetah

+0

OK, das sieht aus wie Umwandlung in unsigned long und Drucken einer vorzeichenlosen Hex-Zahl. –

Antwort

8

Da Sie nur sechs Ziffern benötigen, müssen Sie wahrscheinlich einige Maskierungen vornehmen, um sicherzustellen, dass die Nummer Ihren Anforderungen entspricht. So etwas wie das:

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

Beachten Sie, dass Sie alle langen Ganzzahlen in einer kleinen Reihe von Darstellungen zuordnen. Vielleicht möchten Sie die Nummer in einem bestimmten Bereich vor dem Drucken überprüfen (zB -2^23 < x < 2^23 - 1)

+1

Dies ist die einzige * vollständige * Antwort (die Konvertierung in 'unsigned long' ist erforderlich). – caf

+0

Was bestimmt, welche Zuordnung Sie anhängen? Angenommen, ich war nach einer 32-Bit (8-stellige Zeichenfolge), welche Zuordnung würden Sie dann hinzufügen?(Natürlich würden Sie die Format-Flags auch auf 08 ändern.) – Cheetah

+0

Effektiv ist das Mapping x -> x (mod 2^24), also sind Zahlen> 2^24 wrap around. Bei einer achtstelligen 32-Bit-Zeichenfolge wäre es x -> x (mod 2^32), ob dies eine Injektion ist (reversibel), hängt davon ab, wie groß unsigned long auf der fraglichen Plattform ist. –

1

Verwenden Sie itoa. Es nimmt die gewünschte Basis als Argument.

Oder auf den zweiten Gedanken, nein. Verwenden Sie sprintf, das standardkonform ist.

11

Betrachten Sie sprintf. Der %lx Spezifizierer tut, was Sie wollen.

+2

Darüber hinaus sollten Sie 'snprintf' anstelle von' sprintf' verwenden, wenn Sie können. – dreamlax

1

In dem Titel Sie sagen, Sie wollen eine signierte Hex-Zeichenfolge, aber alle Ihre Beispiele sind vorzeichenlose Hex-Strings. Angenommen, die Beispiele sind, was Sie wollen, der einfachste Weg ist

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