2010-08-10 14 views

Odpowiedz

1

możliwie najprostsze podejście - sprintf zastosowanie (lub snprintf, jeśli masz go):

unsigned char a[SOMESIZE] 
int n = 1234; 
sprintf(a, "%d", n); 

Lub jeśli chcesz to zapisane w formacie binarnym:

unsigned char a[sizeof(int) ]; 
int n = 1234; 
memcpy(a, & n, sizeof(int)); 
+2

Warning: 'memcpy' może produkować nieprzewidywalne zachowanie, jeśli nie stanowią bajt. – Zarel

+3

@Zarel Wyniki będą całkowicie przewidywalne, ale być może niechciane. –

+0

"Nieprzewidywalny" w tym sensie, że nie będzie można przewidzieć wyników, chyba że znasz endianię procesora, na którym go uruchomisz. – Zarel

0

Warning: kod niesprawdzone.

To powinno być konwersja agnostyczna na endianizm. Przechodzi od niskiego do wysokiego. Prawdopodobnie jest to skuteczniejszy sposób, ale nie mogę o tym teraz myśleć.

#include <limits.h> // CHAR_BIT, UCHAR_MAX 

int num = 68465; // insert number here 
unsigned char bytes[sizeof(int)]; 
for (int i=0; i<sizeof(int); i++) 
{ 
    bytes[i] = num & UCHAR_MAX; 
    num >>= CHAR_BIT; 
} 

jestem delegowania to głównie dlatego, że nie widzę innego rozwiązania tutaj, dla których wyniki nie zmieniają się w zależności od tego, co endianness procesor jest.

+0

Ale może użytkownik chce, żeby się zmieniły - aby zachować tę samą kolejność bajtów, co w oryginalnym int. Ponadto, obliczanie rozmiaru macierzy i obliczanie sterowania w pętli jest nieprawidłowe. –

7

Albo, jeśli wiesz, co robisz:

int n = 12345; 
char* a = (char*)&n; 
0

Rozumiem problem jak konwersja liczby na ciąg znaków (podobnie jak Neil).

Poniżej znajduje się prosty sposób na zrobienie tego bez użycia biblioteki.

int i = 0; 
int j = 0; 
do {a[i++] = '0'+n%10; n/=10;} while (n); 
a[i--] = 0; 
for (j<i; j++,i--) {int tmp = a[i]; a[i] = a[j]; a[j] = tmp;} 

Pytanie prawdopodobnie potrzebuje wyjaśnień jak inni oczywiście rozumieć Chciałeś bajtów bazowe wykorzystywane w wewnętrznej reprezentacji int (ale jeśli chcesz zrobić coś takiego, to lepiej użyć pewnego rodzaju stałej wielkości określony zamiast zamiast int, lub nie będziesz wiedział na pewno długości twojej tablicy bajtów).

1

To może pracować

int n=1234;  
const int arrayLength=sizeof(int); 
unsigned char *bytePtr=(unsigned char*)&n; 

for(int i=0;i<arrayLength;i++) 
{ 
    printf("[%X]",bytePtr[i]); 
} 

Zadbaj o celu, który zależy od endianness

Powiązane problemy