Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[unsigned long] to [unsigned char]

Estas en el tema de [unsigned long] to [unsigned char] en el foro de C/C++ en Foros del Web. Buenos días, Os agradecería alguna idea de cómo resolver el siguiente problema: unsigned long var = 10108; unsigned char mi_array [4]; ¿Cómo podría almacenar los ...
  #1 (permalink)  
Antiguo 20/11/2016, 23:44
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 6 años, 7 meses
Puntos: 0
[unsigned long] to [unsigned char]

Buenos días,

Os agradecería alguna idea de cómo resolver el siguiente problema:

unsigned long var = 10108;
unsigned char mi_array[4];

¿Cómo podría almacenar los 8 bytes en las 4 posiciones? ¿Cómo podría meter 2 bytes del unsigned long en cada una de las posiciones del array?
Es un tipo de casting que no se muy bien cómo hacer

Un saludo

Última edición por Zunri; 20/11/2016 a las 23:50
  #2 (permalink)  
Antiguo 21/11/2016, 01:23
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 2 años, 5 meses
Puntos: 204
Respuesta: [unsigned long] to [unsigned char]

El tipo char suele ocupar únicamente un byte. Es imposible almacenar 2 bytes en 1 byte. Hay algoritmos de compresión pero no funcionan a esta escala... el resultado de la compresión ocuparía lo mismo o más que el valor original.

Si unsigned long ocupa 8 bytes tendrás que usar una cadena de longitud 8.

Asumiendo entonces una cadena de 8 bytes, para recuperar los bytes individuales puedes hacer algo así:

opción 1:

Código C:
Ver original
  1. union test
  2. {
  3.   unsigned long varLong;
  4.   unsigned char varChar[8];
  5. };
  6.  
  7. union test test;
  8. test.varLong = 10108;
  9. printf("%.*s", 8, test.varChar);

opción 2:

Código C:
Ver original
  1. unsigned long var = 10108;
  2. unsigned char* varChar = (unsigned char*)&var;
  3. printf("%.*s", 8, test.varChar);

Por otro lado, si lo que sigues necesitando es almacenar dos bytes en cada posición del array entonces necesitas que cada posición del array ocupe dos bytes. En este caso tendrías que usar unsigned short en vez de unsigned char:

Código C:
Ver original
  1. union test
  2. {
  3.   unsigned long varLong;
  4.   unsigned short varChar[4];
  5. };

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.



La zona horaria es GMT -6. Ahora son las 16:09.