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?

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top