Bir int dosyasında depolanan ondalık sayıyı bir bayt dizisine (bir işaretsiz char dizisinde saklanan) dönüştürmem gerekiyor.Int, C cinsinden bayt dizisine mi dönüştürülür?
Herhangi bir ipucu?
Bir int dosyasında depolanan ondalık sayıyı bir bayt dizisine (bir işaretsiz char dizisinde saklanan) dönüştürmem gerekiyor.Int, C cinsinden bayt dizisine mi dönüştürülür?
Herhangi bir ipucu?
olası en basit yaklaşım - kullanım sprintf (veya snprintf, eğer varsa):
unsigned char a[SOMESIZE]
int n = 1234;
sprintf(a, "%d", n);
Yoksa istiyorsanız ikili saklanır:
unsigned char a[sizeof(int) ];
int n = 1234;
memcpy(a, & n, sizeof(int));
Uyarı: denenmemiş kodu.
Bu, bir endianness-agnostic conversion olmalıdır. Alçaktan yükseğe doğru gider. Muhtemelen bunu yapmanın daha etkili bir yolu var, ama şu anda bunu düşünemiyorum. Ben sonuçları işlemci endianness'ın ne bağlı değişiklik olmayan burada başka bir çözüm görmüyorum çünkü
#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;
}
çoğunlukla bu post ediyorum.
Ancak, belki de kullanıcı bunları değiştirmek ister - aynı bayt sırasını orijinal int. Ayrıca, dizi boyutlandırma ve döngü kontrol hesaplamanız yanlış. –
Yoksa ne yaptığınızı biliyorsanız:
int n = 12345;
char* a = (char*)&n;
I (Neil yaptığı gibi) bir dize gösterimine bir numara dönüştürme olarak sorunu anlamak.
Aşağıda herhangi bir lib kullanmadan yapmanın basit bir yolu vardır. Eğer bu tür şeyler yapmak istiyorsanız diğerleri açıkçası yatan bayt int iç temsilinde kullanılan istedi anlaşılan olarak
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;}
soru muhtemelen bazı açıklaması gerekiyor (ama daha iyi tanımlanmış bazı sabit boyutlu türü kullanmak istiyorum bir int yerine veya bayt dizininizin uzunluğunu bilmeyeceksiniz). `Memcpy` öngörülemeyen davranışları üretebilir Eğer endian hesap yoksa:
Bu
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]);
}
endian üzerinde
Uyarı bağlıdır düzenin özen işe yarayabilir. – Zarel
@Zarel Sonuçlar tamamen tahmin edilebilir, ancak belki de istenmeyen. –
"Öngörülemez", sonuçları çalıştırmayı başaramayacağınız sürece işlemcinin endianitesini bilmediğiniz sürece. – Zarel