ordenamiento little hexadecimal endian ejemplos datos conversion big and c++ type-conversion endianness

c++ - little - motorola big endian



Convertir 4 bytes en orden little endian en un entero sin signo (3)

Espero que esto te ayude

unsigned int arr[256]; char ch[256*4] = "your string"; for(int i = 0,k=0;i<256*4;i+=4,k++) { arr[k] = ch[i]|ch[i+1]<<8|ch[i+2]<<16|ch[i+3]<<24; }

Tengo una cadena de 256 * 4 bytes de datos. Estos 256 * 4 bytes deben convertirse en 256 enteros sin signo. El orden en que vienen es poco endian, es decir, los primeros cuatro bytes en la cadena son la pequeña representación endian del primer entero, los siguientes 4 bytes son la pequeña representación endian del siguiente entero, y así sucesivamente.

¿Cuál es la mejor manera de analizar a través de estos datos y combinar estos bytes en enteros sin signo? Sé que tengo que usar operadores bitshift, pero no sé de qué manera.


Si su sistema host es pequeño endian, simplemente lea a lo largo de 4 bytes y cópielo en int. Si su host es big endian, haga lo mismo e invierta los bytes en el int, o inviértalo sobre la marcha mientras copia con bit-shifting


Alternativamente, podemos usar conversión C / C ++ para interpretar un búfer char como una matriz de int sin signo. Esto puede ayudar a salirse con la dependencia de desplazamiento y endianidad.

#include <stdio.h> int main() { char buf[256*4] = "abcd"; unsigned int *p_int = ( unsigned int * )buf; unsigned short idx = 0; unsigned int val = 0; for( idx = 0; idx < 256; idx++ ) { val = *p_int++; printf( "idx = %d, val = %d /n", idx, val ); } }

Esto imprimiría 256 valores, el primero es idx = 0, val = 1684234849 (y todos los números restantes = 0).

Como nota al margen, "abcd" se convierte en 1684234849 porque se ejecuta en X86 (Little Endian), donde "abcd" es 0x64636261 (con ''a'' es 0x61, y ''d'' es 0x64 - en Little Endian, el LSB es en la dirección más pequeña). Entonces 0x64636261 = 1684234849.

Tenga en cuenta también que, si usa C ++, reinterpret_cast se debe usar en este caso:

const char *p_buf = "abcd"; const unsigned int *p_int = reinterpret_cast< const unsigned int * >( p_buf );