Necesito convertir el número decimal almacenado en un int, a una matriz de bytes (también conocido como almacenado en una matriz de caracteres sin signo).¿Convertir int a una matriz de bytes en C?
¿Alguna pista?
Necesito convertir el número decimal almacenado en un int, a una matriz de bytes (también conocido como almacenado en una matriz de caracteres sin signo).¿Convertir int a una matriz de bytes en C?
¿Alguna pista?
más simple posible enfoque - sprintf uso (o snprintf, si lo tiene):
unsigned char a[SOMESIZE]
int n = 1234;
sprintf(a, "%d", n);
O si quieres que almacenó en binario:
unsigned char a[sizeof(int) ];
int n = 1234;
memcpy(a, & n, sizeof(int));
Advertencia: código no probado.
Esto debería ser una conversión independiente del endianness. Va de bajo a alto. Probablemente haya una manera más eficiente de hacerlo, pero no puedo pensar en eso en este momento.
#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;
}
Quiero poner esta todo porque no veo otra solución a este problema para los que los resultados no cambian dependiendo de lo que su procesador es Endianness.
Pero quizás el usuario quiera que cambien, para mantener el mismo orden de bytes que en el int original. Además, su cálculo de matriz y control de bucle es incorrecto. –
O si usted sabe lo que está haciendo:
int n = 12345;
char* a = (char*)&n;
que entiende el problema como la conversión de un número a una representación de cadena (como lo hace Neil).
A continuación se muestra una forma sencilla de hacerlo sin usar ninguna lib.
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;}
La pregunta probablemente necesita alguna aclaración, obviamente, como otros entienden que quería que los bytes que se han empleado en la representación interna de int (pero si usted quiere hacer ese tipo de cosas, es mejor utilizar algún tipo de tamaño fijo definido en lugar de un int, o no sabrás a ciencia cierta la longitud de tu matriz de bytes).
Esto podría funcionar
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]);
}
Cuida de orden que depende de endianness
Advertencia: 'memcpy' puede producir un comportamiento impredecible si no dan cuenta de orden de bytes. – Zarel
@Zarel Los resultados serán completamente predecibles, pero quizás no deseados. –
"Imprevisible" en el sentido de que no podrá predecir los resultados a menos que sepa la endianidad del procesador en el que lo ejecuta. – Zarel