Advertisement
AntonioVillanueva

Endiannes , detectando y corrigiendo arquitecturas

Nov 12th, 2021
1,156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.23 KB | None | 0 0
  1. #include <stdio.h>
  2. /*
  3.  * "Endianness" es el orden o secuencia de bytes de una palabra de datos digitales en la memoria de la computadora.
  4.  * El "endianismo" se expresa principalmente como big-endian (BE) o little-endian (LE).
  5.  * Una arquitectura big-endian almacena el byte más significativo de una PALABRA W (16bits) en la dirección de memoria más pequeña
  6.  * y el byte menos significativo en la más grande .
  7.  * Una arquitectura "little-endian", por el contrario, almacena el byte menos significativo en la dirección más pequeña.
  8.  * "Endianness" también se puede utilizar para describir el orden en el que se transmiten los bits a través de un canal de comunicación,
  9.  * por ejemplo, big-endian en un canal de comunicaciones transmite primero los bits más significativos.
  10. */
  11.  
  12. //Invierte la palabra segun la arguitectura
  13. unsigned short  swap (unsigned short word)
  14. {
  15.     unsigned char endianTest[2] = {0,1};//Guarda dos bytes (uchar) [0]=0x00,[1]=0x01 , como palabra seria 0x0001 =1d
  16.  
  17.     printf ("Como se ve EL TEST endianness = 0x%04X = %d \n", *(short*) endianTest,*(short*) endianTest);
  18.    
  19.     //La palabra es mayor de 0xFF=255 ? Si es asi la parte inferior ha sido guardada en la superior
  20.     if (*(short*)endianTest==256)//Miro la palabra si ha sido guardada como 0x0100=256 la invierto
  21.     {
  22.         printf ("Esta invertida !\n");
  23.         //WORD(16bits)=HIGH(8bits)+LOW(8bits)
  24.         unsigned char high,low;//Declaro dos bytes (8bits) ambos forman la palabra W de 16 bits
  25.         high = (word >> 8 )& 0xff;//La parte alta HIGH la traslado a la parte baja LOW  de la palabra. >>8
  26.         printf (" H = 0x%02X ",high);
  27.         low = word & 0xff;//Recupero la parte inferior de  la palabra LOW
  28.         printf (" L = 0x%02X ",low);   
  29.         printf (" W=0x%04X \n",(low << 8) | high); 
  30.         return ((low << 8) | high );//Junto los dos bytes(8bits)  y retorno una palabra de 16bits
  31.     }
  32.  
  33.     printf ("No Esta invertida !\n");  
  34.     return (word);//No ha sido invertida, no es mayor a 0xFF (255) se devuelve tal cual
  35. }
  36.  
  37. int main(){
  38.     unsigned short palabra=0x0001;//p.e una palabra de 16bits que contiene 0x0001=1d , H=0x00 + L=0x001
  39.     printf ("Palabra de test =0x%04X \n",palabra);     
  40.     printf ("Palabra de test RESULTADO = 0x%04X",swap (palabra));//Envio 1 en decimal en una palabra de 16bits
  41.     return 0;
  42. }
  43.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement