Copiar un breve int a una matriz de char
-
22-10-2019 - |
Pregunta
Tengo una variable entera corta llamada s_int que contiene valor = 2
unsighed short s_int = 2;
Quiero copiar este número en una matriz de char a la primera y segunda posición de una matriz de char.
Digamos que tenemos char buffer[10];
. Queremos los dos bytes de s_int
para ser copiado en buffer[0]
y buffer[1]
.
¿Cómo puedo hacerlo?
Solución
La forma habitual de hacerlo sería con los operadores bit a bit para cortarlo y cortarlo, un byte a la vez:
b[0] = si & 0xff;
b[1] = (si >> 8) & 0xff;
Aunque esto realmente debería hacerse en un unsigned char
, no una llanura char
ya que están firmados en la mayoría de los sistemas.
El almacenamiento de enteros más grandes se puede hacer de manera similar, o con un bucle.
Otros consejos
*((short*)buffer) = s_int;
Pero Viator Empor que el orden de byte resultante variará con la endianness.
Mediante el uso de punteros y yesos.
unsigned short s_int = 2;
unsigned char buffer[sizeof(unsigned short)];
// 1.
unsigned char * p_int = (unsigned char *)&s_int;
buffer[0] = p_int[0];
buffer[1] = p_int[1];
// 2.
memcpy(buffer, (unsigned char *)&s_int, sizeof(unsigned short));
// 3.
std::copy((unsigned char *)&s_int,
((unsigned char *)&s_int) + sizeof(unsigned short),
buffer);
// 4.
unsigned short * p_buffer = (unsigned short *)(buffer); // May have alignment issues
*p_buffer = s_int;
// 5.
union Not_To_Use
{
unsigned short s_int;
unsigned char buffer[2];
};
union Not_To_Use converter;
converter.s_int = s_int;
buffer[0] = converter.buffer[0];
buffer[1] = converter.buffer[1];
Lo memcpería, algo como
memcpy(buffer, &s_int, 2);
El endianness se conserva correctamente para que si se coloca búfer en corto sin firmar *, puede leer el mismo valor de s_int de la manera correcta. Otra solución debe ser consciente de Endian o podría intercambiar LSB y MSB. Y, por supuesto, el tamaño de (corto) debe ser 2.
Si no quieres hacer todas esas cosas de bit a bit, podrías hacer lo siguiente
char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);