2010-04-29 9 views
5

MASSIVE EDIT:C - Konwersja int długi ciąg szesnastkowy do podpisanego

mam long int zmienna, że ​​trzeba konwertować do podpisanego ciąg 24bit szesnastkowym bez „0x” na początku. Łańcuch musi składać się z 6 znaków, po których następuje terminator znaków "\ 0", dlatego konieczne jest dodanie zer wiodących.

Przykłady: [-1 -> FFFFFF] --- [1 -> 000001] --- [71 -> 000047]

odpowiedzi Wydaje się lewę:

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

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

Aby wyjaśnić, co masz na myśli przez podpisany hex, np. do czego ma zostać przeliczone -1? –

+0

FFFFFF (jeśli dokonałem konwersji: s) – Cheetah

+0

OK, wygląda na to, że konwersja ma wartość unsigned long i drukowanie niepodpisanego numeru heksadecymalnego. –

Odpowiedz

8

Ponieważ potrzebujesz tylko sześciu cyfr, prawdopodobnie będziesz musiał wykonać pewne maskowanie, aby upewnić się, że numer jest zgodny z wymaganiami. Coś takiego:

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

Pamiętaj, że mapujesz wszystkie długie liczby całkowite na mały zakres reprezentacji. Możesz sprawdzić, czy numer jest w określonym zakresie przed wydrukowaniem (np. -2^23 < x < 2^23 - 1)

+1

Jest to jedyna * pełna * odpowiedź w tej chwili (wymagana jest konwersja na 'unsigned long'). – caf

+0

Co decyduje o tym, jakie mapowanie dodasz? Powiedzmy, że byłem po 32-bitowym (ciąg 8 znaków), jakie mapowanie byś następnie dodał?(Oczywiście zmieniłbyś również flagi formatu na 08) – Cheetah

+0

Skutecznie, mapowanie to x -> x (mod 2^24), więc numery> 2^24 zawijają się. Przy ośmioznakowym, 32-bitowym łańcuchu, byłby to x -> x (mod 2^32), niezależnie od tego, czy jest to wstrzyknięcie (odwracalne), zależy od tego, jak duża długość jest niepoprawna na danej platformie. –

1

Użyj itoa. Jako argument przyjmuje wymaganą bazę.

Albo po raz drugi, nie. Użyj sprintf, która jest zgodna ze standardem.

11

Spójrz na sprintf. Specyfikator %lx robi to, co chcesz.

+2

Co więcej, powinieneś użyć 'snprintf' zamiast' sprintf', jeśli możesz. – dreamlax

1

W tytule mówisz, że chcesz podpisany ciąg szesnastkowy, ale wszystkie twoje przykłady są niepodpisanymi ciągami heksadecymalnymi. Zakładając, że przykłady są tym, czego potrzebujesz, najłatwiejszy sposób to

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