Potrzebuję przekonwertować liczbę dziesiętną zapisaną w int, na tablicę bajtów (zapisaną w niepisanej tablicy znaków).Konwertuj int na tablicę bajtów w C?
Jakieś wskazówki?
Potrzebuję przekonwertować liczbę dziesiętną zapisaną w int, na tablicę bajtów (zapisaną w niepisanej tablicy znaków).Konwertuj int na tablicę bajtów w C?
Jakieś wskazówki?
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));
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.
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. –
Albo, jeśli wiesz, co robisz:
int n = 12345;
char* a = (char*)&n;
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).
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
Warning: 'memcpy' może produkować nieprzewidywalne zachowanie, jeśli nie stanowią bajt. – Zarel
@Zarel Wyniki będą całkowicie przewidywalne, ale być może niechciane. –
"Nieprzewidywalny" w tym sensie, że nie będzie można przewidzieć wyników, chyba że znasz endianię procesora, na którym go uruchomisz. – Zarel