Terminología informática big-endian
La palabra Endian proviene de “Los viajes de Gulliver” escrito por Jonathan Swift. Este libro divide a todas las personas en dos categorías según los diferentes métodos para romper huevos. Las personas que rompen huevos por el extremo redondo se clasifican como Big Endians, y las personas que rompen huevos por el extremo puntiagudo se clasifican como Little Endians. La guerra civil en Lilliput surge de si se rompen los huevos del extremo grande (Big-Endian) o del extremo pequeño (Little-Endian). BigEndian y LittleEndian casi provocan una guerra en la industria informática. En la industria informática, Endian representa el orden en que se almacenan los datos en la memoria. Los siguientes ejemplos ilustran la diferencia entre los modos endian grande y pequeño en las computadoras.
Si un entero de 32 bits 0x12345678 se almacena en una variable entera (int), la variable entera se almacenará en la memoria en modo big-endian o little-endian como se muestra en la siguiente tabla. Para simplificar, este libro utiliza OP0 para representar el MSB (Byte más significativo) de datos de 32 bits y OP3 para representar el LSB (Byte menos significativo) de datos de 32 bits. ;Desplazamiento de dirección; modo Big Endian; modo Little Endian 0x00 12 (OP0) 78 (OP3) 0x01 34 (OP1) 56 (OP2) 0x02 56 (OP2) 34 (OP1) 0x03 78 (OP3) 12 (OP0) Si A 16 -bit entero 0x1234 se almacena en una variable entera corta (corta). Esta variable entera corta se almacena en la memoria en modo endian como se muestra en la siguiente tabla. ;Desplazamiento de dirección; modo Big-endian; modo Little-endian 0x00 12 (OP0) 34 (OP1) 0x01 34 (OP1) 12 (OP0) Como sabemos por la tabla anterior, la principal diferencia entre usar el modo tamaño para almacenar datos es que en el almacenamiento En orden de bytes, el modo big-endian almacena los bits de orden superior en direcciones bajas, y el modo little-endian almacena los bits de orden superior en direcciones altas. El uso del método big-endian para el almacenamiento de datos está en línea con el pensamiento humano normal, mientras que el uso del método little-endian para el almacenamiento de datos favorece el procesamiento por computadora. Hasta el momento, no hay ninguna conclusión sobre si es mejor utilizar big endian o little endian para el almacenamiento de datos.
Algunos sistemas de procesador utilizan el modo little endian para el almacenamiento de datos, como el Pentium de Intel. Algunos sistemas de procesador utilizan métodos big-endian para el almacenamiento de datos, como los procesadores IBM Semiconductor y PowerPC de Freescale. No sólo para los procesadores, también existe la opción de utilizar big endian o little endian para el almacenamiento de datos en el diseño de algunos periféricos.
Por lo tanto, en un sistema de procesador, es posible que existan modos big-endian y little-endian al mismo tiempo. Este fenómeno trae muchos problemas al diseño de software y hardware del sistema, lo que requiere que los ingenieros de diseño de sistemas tengan un conocimiento profundo de las diferencias entre los modos big-endian y little-endian. La diferencia entre los modos big-endian y little-endian se refleja en los registros, el conjunto de instrucciones, el bus del sistema y otros niveles de un procesador. Desde una perspectiva de software, los procesadores con diferentes modos finales deben considerar las diferencias en los modos finales al transferir datos. Por ejemplo, al transmitir datos de red, se debe considerar la conversión de modo final. Los programadores que tengan experiencia en la programación de interfaces Socket deben haber utilizado las siguientes funciones para convertir el orden de bytes endian grande y pequeño.
¨ #define ntohs(n) //orden de bytes de red de tipo de datos de 16 bits para conversión de orden de bytes de host
¨ #define htons(n) //tipo de datos de 16 bits Conversión de orden de bytes de host a orden de bytes de red
¨ #define ntohl(n) //Conversión de orden de bytes de red de tipo de datos de 32 bits a orden de bytes de host
¨ #define htonl(n ) // Conversión del orden de bytes del host del tipo de datos de 32 bits al orden de bytes de la red
El orden de bytes de la red utilizado por Internet utiliza el modo big endian para el direccionamiento y la palabra del host El orden de las secciones varía según el procesador Por ejemplo, los procesadores PowerPC usan el modo big-endian, mientras que los procesadores Pentuim usan el modo little-endian.
No es necesario convertir el orden de bytes del procesador en modo big-endian al orden de bytes de la red. En este momento, ntohs(n)=n, ntohl =n; El procesador en modo little-endian se convierte al orden de bytes de la red. Se deben convertir los bytes, en este momento ntohs(n) = __swab16(n), ntohl =__swab32(n). Las definiciones de las funciones __swab16 y __swab32 son las siguientes. #definir ___swab16(x)
{
__u16 __x = (x);
((__u16)(
((( __u16)(__x)amp;
}
#define ___swab32(x)
{
__u32 __x = (x);
((__u32)(
(((__u32)(__x) amp; (__u32)0x000000ffUL) lt;lt; 24) |
(( (__u32)(__x) y (__u32) 0x000ff000UL) lt; 8) |
(((__u32) (__x) y (__u32) 0x00ff0000UL) gt; gt; 8) |
( ((__u32)(__x) amp; (__u32)0xff000000UL) gt; gt; 24)));
} El procesador PowerPC proporciona cuatro instrucciones: lwbrx, lhbrx, stwbrx, sthbrx para procesar bytes Conversión de pedidos para optimizar funciones como __swab16 y __swap32. Además, la instrucción rlwimi en el procesador PowerPC también se puede utilizar para implementar funciones como __swab16 y __swap32. En LinuxPowerPC, se definen una serie de funciones relacionadas con la conversión del orden de bytes y sus detalles se definen en el archivo ./include/asm-powerpc/byteorder.h.
Los programadores también deben considerar los problemas del modo final al procesar archivos normales. Los resultados obtenidos mediante operaciones de lectura y escritura de 32 y 16 bits en archivos con un procesador en modo big-endian son diferentes de los de un procesador en modo little-endian. Los lectores están lejos de comprender realmente la diferencia entre los modos endian grande y pequeño simplemente desde la perspectiva del software. De hecho, para comprender verdaderamente la diferencia entre los modos endian grande y pequeño, debemos tener un conocimiento profundo de las diferencias entre los modos endian grande y pequeño desde la perspectiva del sistema, desde el conjunto de instrucciones, los registros y el bus de datos. Además de las diferencias en la programación de software para diferentes modos finales en la Sección 4.2.1, el hardware del procesador también tiene un diseño diferente debido a problemas con el modo final.
Desde una perspectiva del sistema, la cuestión del modo final tiene diferentes impactos en el diseño de software y hardware. Cuando existen modos de endian grande y pequeño en un sistema de procesador, se debe llevar a cabo un procesamiento especial para acceder a estos diferentes modos finales.
Los procesadores PowerPC dominan el mercado de redes. Se puede decir que la gran mayoría de los equipos de comunicación utilizan procesadores PowerPC para el procesamiento de protocolos y otros procesos de información de control. Este también puede ser el caso de la mayoría de los protocolos en la red. La razón para utilizar el direccionamiento big-endian. Por lo tanto, en el diseño de software relacionado con protocolos de red, los procesadores que utilizan el modo little-endian deben manejar el cambio del modo endian en el software. Pentium domina el mercado de las computadoras personales, por lo que la mayoría de los periféricos utilizados en las computadoras personales usan el modo little-endian, incluidos algunos buses PCI, Flash y otros dispositivos utilizados en equipos de red. Esto también requiere que los ingenieros de hardware presten atención al modo endian en el diseño de hardware. .
Los periféricos little-endian de este libro se refieren a los registros de dichos periféricos que se almacenan en modo little-endian, como el espacio de configuración de dispositivos PCI, registros en NOR FLASH, etc.
Para algunos dispositivos, como las partículas DDR, no hay registros almacenados en modo little-endian, por lo que lógicamente no hay necesidad de convertir a modo endian. En el diseño, solo es necesario interconectar los buses de datos de ambas partes en una correspondencia uno a uno, sin necesidad de conversión del bus de datos.
Desde una perspectiva de aplicación práctica, los procesadores que usan el modo little endian deben manejar la conversión del modo endian en el software, porque cuando los procesadores que usan el modo little endian están interconectados con periféricos little endian, no se requiere conversión.
Los procesadores que utilizan el modo big-endian necesitan manejar la conversión del modo endian durante el diseño del hardware. Los procesadores en modo big endian deben abordar múltiples aspectos, como registros, conjuntos de instrucciones, buses de datos y la conexión entre el bus de datos y los periféricos little endian, para resolver el problema de la conversión del modo endian cuando se conectan a periféricos little endian.
Los procesadores basados en modos endian grande y pequeño son diferentes en la definición del orden de bits de los registros y buses de datos.
Un procesador de 32 bits que utiliza el modo big-endian, como el MPC8541 basado en el núcleo E500, define el msb (bit más significativo) más alto de su registro como 0 y el lsb (bit más significativo de arrendamiento) más bajo de su registro como 31; el procesador de 32 bits en modo little-endian define el bit más alto de su registro como 31 y la dirección de orden inferior como 0.
En correspondencia con esta dirección, el bit más alto del bus de datos de un procesador de 32 bits que usa el modo big endian es 0 y el bit más alto es 31; procesador que usa el modo little endian es 31, el bit más bajo es 0. Como se muestra en la Figura 4.5. OP0 OP1 OP2 OP3 OP0 OP1 OP2 OP3 31 0 31 0; Figura 4.5 Definición de registros del procesador en modo big-endian; definición de secuencia de bits de registro del procesador en modo big-endian; procesador en modo big-endian externo; La secuencia de bits del bus también sigue la misma regla Dependiendo de si el bus de datos utilizado es de 32 bits, 16 bits u 8 bits, la secuencia de bits del bus externo de los procesadores finales grandes y pequeños es diferente.
¨ En modo big-endian, el msb del bus de datos de 32 bits es el bit 0, y el MSB son los campos del 0 al 7 del bus de datos, mientras que el lsb es el bit 31; y el LSB son los campos 24 al 31. En modo little-endian, el msb del bus de 32 bits es el bit 31, el MSB son los bits 31 al 24 del bus de datos, el lsb es el bit 0 y el LSB es el campo 7~0.
¨ En modo big-endian, el msb del bus de datos de 16 bits es el bit 0, y el MSB son los campos del 0 al 7 del bus de datos, mientras que el lsb es el bit 15; y el LSB son los campos del 8 al 15. En el modo little endian, el msb del bus de 16 bits es el bit 15, el MSB son los bits del 15 al 7 del bus de datos, el lsb es el bit 0 y el LSB es el campo 7~0.
¨ En modo big-endian, el msb del bus de datos de 8 bits es el bit 0, y el MSB son los campos del 0 al 7 del bus de datos, mientras que el lsb es el bit 7; y el LSB son los campos del 0 al 7.
En el modo little endian, el msb del bus de 8 bits es el séptimo bit, el MSB son los bits del séptimo al 0 del bus de datos, el lsb es el bit 0 y el LSB es el campo del séptimo al 0.
Del análisis anterior, podemos saber que para buses de datos de 8, 16 y 32 bits de ancho, la posición del MSB y MSB del bus de datos no cambiará cuando se use big- modo endian En el modo little-endian, las posiciones lsb y LSB del bus de datos no cambiarán.
Por este motivo, los procesadores en modo big-endian generalmente incluyen los campos 0 a 7 para accesos a memoria de 8 bits, 16 bits y 32 bits (incluido el acceso a periféricos), es decir, MSB. Los accesos a la memoria de 8, 16 y 32 bits del procesador en modo little-endian incluyen los bits 7~0, y los campos 7~0 en el modo little endian son el LSB.
Dado que los buses de datos de los procesadores endian grandes y pequeños tienen diferentes definiciones de buses de datos de 8, 16 y 32 bits de ancho, es necesario discutir cómo manejar la conversión del modo final a nivel del sistema. por separado.
En un sistema de procesador big-endian, es necesario gestionar el acceso del procesador big-endian a los periféricos little-endian.
1.1.2.1 El procesador big-endian accede a periféricos little-endian de 32 bits Cuando el procesador big-endian utiliza un bus de 32 bits para acceder a periféricos little-endian, el bus de datos de 32 bits del. Procesador big-endian Los bits 0 a 7 se utilizan para procesar OP0, los bits 8 a 15 se utilizan para procesar OP1, los bits 16 a 23 se utilizan para procesar OP2 y los bits 24 a 31 se utilizan para procesar OP3. El dispositivo little-endian de 32 bits utiliza los bits 31 ~ 24 del bus de datos para procesar OP0, los bits 23 ~ 16 para procesar OP1, los bits 15 ~ 8 para procesar OP2 y los bits 7 ~ 0 para procesar OP3.
Los procesadores big-endian, como MPC8541, utilizan instrucciones stw, sth, stb y lwz, lhz, lbz para acceder a dispositivos externos de 32 bits. Una vez completadas estas instrucciones, los datos almacenados en el dispositivo externo se leerán en el registro general del MPC8541. Para garantizar la coherencia del software, cuando se completa el acceso, el orden de bytes almacenado en los registros generales, es decir, OP0, OP1, OP2 y OP3, debe ser coherente con el orden de bytes almacenado en el periférico little-endian. . En este momento, se debe realizar cierto procesamiento cuando se utiliza el bus de datos del procesador de gama grande para conectarse a los periféricos de gama pequeña, y las conexiones deben realizarse de acuerdo con una determinada topología para garantizar la coherencia del software. La topología de la conexión entre el bus de datos del procesador big-endian y los periféricos little-endian se muestra en la Figura 4.6. OP0 OP1 OP2 OP3 31 31 0 7 8 15 16 23 24 24 23 16 15 8 7 0; bus de datos de 32 bits del procesador big-endian; interfaz de bus de 32 bits del dispositivo little-endian; periférico little-endian Suponga que la conexión de 32 bits OP0 OP1 OP2 OP3 se muestra en la Figura 4.6. Cuando se utiliza un procesador big-endian para acceder a un dispositivo little-endian, los respectivos campos OP0 ~ OP3 están conectados directamente. El bit más alto del bus de datos de 32 bits en un procesador big-endian es 0 y el bit más bajo es 31, mientras que el bit más alto de un dispositivo little-endian es 31 y el bit más bajo es 0; Por lo tanto, al realizar conexiones de señal, los ingenieros de hardware necesitan interconectar los bits 0~31 del procesador big-endian con los bits 31~0 del dispositivo little-endian.
1.1.2.2 Los procesadores Big-endian acceden a periféricos little-endian de 8 y 16 bits. Los procesadores Big-endian utilizan buses de datos de 8 y 16 bits para conectar 8 y 16 bits. periféricos little-endian. Para los procesadores de 32 bits, el bus utilizado para conectar periféricos suele ser de 32 bits. Por lo tanto, los ingenieros de arquitectura tienen dos opciones al diseñar un bus de procesador de gran tamaño: usar la parte de gama alta (campos 0 ~ 15) o la parte de gama baja (campos 16 ~ 31) del bus de 32 bits para conectarse. dispositivos de gama pequeña. Los procesadores PowerPC utilizan la parte de gama alta del bus de 32 bits, es decir, los bits 0 a 15 del bus de datos para conectarse a dispositivos little-endian de 16 bits y los bits 0 a 7 para conectarse a dispositivos little-endian de 8 bits. dispositivos endian.
Cuando el procesador PowerPC utiliza un bus de 16 bits para acceder a periféricos little-endian de 16 bits, los bits 0 a 7 del bus de datos de 16 bits del procesador PowerPC se utilizan para procesar OP0, bits 8. ~15 Se utiliza para tratar con OP1. El dispositivo little-endian de 16 bits utiliza los bits 15 a 8 del bus de datos para procesar OP0 y los bits 7 a 0 para procesar OP1.
Cuando el procesador PowerPC utiliza un bus de 8 bits para acceder a periféricos little-endian de 8 bits, los campos 0 ~ 7 del bus de datos de 8 bits del procesador PowerPC se utilizan para procesar OP0. El dispositivo little-endian de 8 bits utiliza los bits 7 ~ 0 del bus de datos para procesar OP1. La relación de conexión entre el procesador big-endian y los periféricos little-endian se muestra en la Figura 4.7. OP0 OP1 OP0 OP1 15 0 7 8 15 8 7 0; bus de datos de 8/16 bits del procesador big-endian; interfaz de bus de 8/16 bits del dispositivo little-endian; Procesador -endian y periféricos little-endian Conexión de 16 bits OP0 OP0 7 0 7 0 Similar a la interfaz de bus de 32 bits, el procesador PowerPC puede usar instrucciones stw, sth, stb y lwz, lhz, lbz para acceder a archivos externos de 32 bits. dispositivos y almacenar los datos en el correspondiente registro de finalidad general. Cuando se completa el acceso, el orden de bytes almacenado en el registro general, OP0 y OP1, debe ser coherente con el orden de bytes almacenado en el periférico little-endian.
Cuando el procesador PowerPC accede a periféricos little-endian de 8 bits, solo puede acceder a datos de 8 bits en un ciclo de bus si el procesador utiliza la instrucción stw o lwz para acceder a 32 bits en el 8-bit. Dispositivo bit little-endian. Cuando se pasan datos de bits, OP0, OP1, OP2 y OP3 se transfieren secuencialmente al registro de propósito general de PowerPC en el bus de datos.
Cuando el procesador PowerPC accede a periféricos little-endian de 16 bits, solo puede acceder a datos de 16 bits en un ciclo de bus si el procesador utiliza la instrucción stw o lwz para acceder a 32 bits en el ciclo de 16 bits. Dispositivo bit little-endian. Cuando se generan datos de bits, OP0 ~ 1 y OP2 ~ 3 se transfieren secuencialmente al registro de propósito general de PowerPC en el bus de datos.
Cuando el procesador PowerPC utiliza la instrucción sth o lhz para acceder a un dispositivo little-endian de 16 bits, el dispositivo little-endian de 16 bits transfiere los bits 15~0 de los datos a los bits 0~ del bus del procesador PowerPC de 15 bits, y luego los datos finalmente se transfieren al registro general correspondiente. Muchos lectores aquí se sentirán confundidos, porque para garantizar la coherencia del software, cuando el procesador PowerPC usa la instrucción lhz para acceder al registro de 16 bits de un dispositivo little-endian de 16 bits, el resultado debe guardarse en bits 16 ~ 31 del registro general, y No 0~15 dígitos. ¿Cómo mueve el procesador PowerPC los 0~15 bits de datos en el bus del sistema a los bits 16~31 del registro? Para ello necesitamos analizar la instrucción lhz. lhz rD, d(rA)
si rA = 0 entonces b ← 0
si no b ← (rA)
EA ← b EXTS(d)
rD ← (24) 0 || MEM(EA, 1) De la descripción anterior de la instrucción lhz, sabemos que la instrucción lhz almacena directamente OP0 y OP1 del bus de datos en los bits 16~31 de el registro y borre los bits 0~15 directamente.
Cuando el procesador PowerPC utiliza la instrucción stb o lbz para acceder a un dispositivo little-endian de 8 bits, el dispositivo little-endian de 8 bits transfiere los bits 7~0 de los datos a los bits 0~ del bus del procesador PowerPC 7 bits, y luego los datos finalmente se transfieren al registro general correspondiente. La descripción de la instrucción lbz es la siguiente.
lbz rD, d(rA)
si rA = 0 entonces b ← 0
si no b ← (rA)
EA ← b EXTS(d)
rD ← (24) 0 || MEM(EA, 1) De la descripción anterior de la instrucción lhz, sabemos que la instrucción lhz almacenará directamente OP0 desde el bus de datos en los bits 24~31 del registro y se borrarán los bits 0~23.
Artículo 2:
Big-endian y little-endianlt;; transferencia a gt;
2007-12-07 20:36; son little endian (preste atención al modificar la tabla de particiones) y los microcontroladores generalmente son big endian. Hoy encontré un problema con el orden de los bytes, aunque parece muy simple, nunca lo entendí completamente, simplemente busqué información y lo pensé. Debido a que las computadoras actuales usan ocho bits y un byte como unidad de almacenamiento, un entero de 16 bits, que es una abreviatura en lenguaje C, puede tener dos en la memoria. Hay dos órdenes de almacenamiento: big-endian y litte. -endian Considere un entero corto 0x3132 (0x32 es el bit bajo, 0x31 es el bit alto), asígnelo a una variable corta, luego su almacenamiento en la memoria puede tener las dos situaciones siguientes:
Grande-. endian:
----------------gt; gt; gt; gt ;gt;gt;gt;;Dirección creciente de la memoria
Dirección de variable corta
0x1000 0x1001
_______________________________| || 0x31 |_______________ | el byte de orden inferior, es decir, el byte de orden superior está en el extremo inferior de la dirección de memoria. Puede recordarlo así (big-endian-gt;; byte de orden superior-gt;; delante-gt. ;; orden lógico normal)
Little-endian:
----------------gt; ;gt;gt;gt;;Dirección creciente de la dirección de memoria
Dirección de variable corta
0x1000 0x1001
_____________________________ || 0x32 |______________ _______________ | El byte de orden inferior está delante del byte de orden superior, es decir, el byte de orden inferior está en el extremo inferior de la dirección de memoria. Se puede recordar así (little endian-gt;; byte de orden inferior-. gt;; delante-gt;; y lógica normal Invierte el orden)
Puedes hacer un experimento
Descarga el siguiente programa en Windows
#include lt; stdio.hgt;
#include lt; afirmar.hgt;
void main(void)
{ prueba corta* fp; 0x3132; // ('1' del código 31ASⅡC, código 32ASⅡC '2')
if ((fp = fopen (c:\\test.txt,wb)) == NULL)
assert(0); fwrite(amp;test, sizeof(short), 1, fp);
}
Luego abre la prueba. txt en la unidad C, puede ver que el contenido es 21 y la prueba es igual a 0x3132. Se puede ver claramente que el orden de bytes de x86 es de gama baja primero. Si colocamos este mismo código en un (grande-. endian) máquina y ejecútelo, el archivo escrito será 12. Esto está en este libro. No hay problema al usarlo en la máquina, pero surgen problemas cuando copia este archivo de una máquina big-endian a una máquina little-endian. .
Como en el ejemplo anterior, estamos usando big-endi
Cree este archivo de prueba en la máquina de An, cópielo en la máquina little-endian y luego use fread para leerlo en un resumen. Lo que obtenemos ya no es 0x3132 sino 0x3231, por lo que la lectura de datos es incorrecta, por lo que al transmitir datos. dos máquinas con diferente orden de bytes, se debe prestar especial atención al orden de los bytes. Comprender el orden de los bytes puede ayudarnos a escribir código más portátil.
Debido a la diferencia en el orden de los bytes, se define que todos los datos relacionados. El orden de bytes utiliza big-endian durante la transmisión de la red. Se definen cuatro macros en el código BSD para su procesamiento:
# define ntohs(n) //Orden de bytes de la red al orden de bytes del host n representa neto, h representa el host. , s representa corto
#define htons(n) //Orden de bytes del host a orden de bytes de red El orden n representa neto, h representa host, s representa corto
#define ntohl( n) //Orden de bytes de red a orden de bytes de host n representa neto, h representa host, l representa largo
#define htonl(n) //Orden de bytes de host a orden de bytes de red n representa neto, h representa host, l representa long
El siguiente es un ejemplo de la implementación de una de estas macros: # define sw16(x) \ ((short)(\ (((short)(x) amp; ( short)0x00ffU) lt; lt; 8) | \ (((short)(x) amp; (short)0xff00U) gt; gt; 8)))
Lo que se implementa aquí es un intercambio de dos bytes. Varias otras macros son similares.
Reescribamos el programa anterior
#include lt;stdio.hgt;
#include lt;assert.hgt ;
#define sw16(x) \
((corto )(\ (((corto)(x) amp; (corto)0x00ffU) lt; lt; 8) | \ (((short)(x) amp; (short)0xff00U) gt; gt; 8)))
// Debido a que x86 usa primero el bit de orden inferior, es necesario intercambiarlo en un byte de red orden
#define htons(x) sw16(x)
void main(void)
{ prueba corta* fp;
test = htons(0x3132); //('1' en el código 31ASⅡC, '2' en el código 32ASⅡC) if ((fp = fopen (c:\\test.txt,wb)) == NULL) p>
assert(0); fwrite(amp;test,sizeof(short),1,fp); fclose(fp);
}
Si estás activado una máquina con el byte alto primero, ya que es consistente con el orden de bytes de la red, no podemos hacer nada, solo la macro #define htons(x) sw16(x) debe ser reemplazada por #define htons(x) (x) .
Cuando entendí este problema por primera vez, siempre me pregunté por qué no era necesario intercambiar otros datos. Por ejemplo, escribimos un búfer en un archivo y finalmente lo descubrimos. Los tipos de caracteres sin firmar se escriben byte a byte, este orden es fijo y no hay problema de orden de bytes. Ah, artículo 3:
p>
Los términos big-endian y little-endian provienen de la obra satírica del siglo XVIII Los viajes de Gulliver de Jonathan Swift. Los ciudadanos del Imperio Blefuscu se dividieron en dos grupos según cómo comían los huevos: algunos comenzaban desde el extremo grande del huevo, mientras que el otro grupo comía desde el extremo pequeño.
La CPU x86 usa LE (llamado "orden de bytes de host" en Windows), mientras que SocksAddr usa BE (es decir, "orden de bytes de red"), por lo que cuando usa programación de red necesita usar htns, html , nths, nthl para invertir el orden de los bytes.
De hecho, lo entenderás una vez que estés familiarizado con el ensamblaje. Desafortunadamente, mi ensamblaje es muy miserable. ¿Cuál es el orden de bytes más acorde con el pensamiento humano? Se dice que la dirección de orden del valor almacenado de orden inferior y la dirección de orden superior del valor almacenado de orden superior es el orden de bytes más acorde con el pensamiento humano, porque desde la primera impresión de las personas, si el valor de orden inferior es pequeño, debe colocarse en un lugar con una dirección de memoria pequeña, es decir, el valor de orden inferior de la dirección de memoria. Por el contrario, el valor de orden superior debe colocarse en la memoria. Donde la dirección es grande, es decir, los bits altos de la dirección de memoria son big-endian. La dirección de orden de bytes más intuitiva es la dirección de bits altos del valor almacenado de bits bajos. Se dice que es intuitivo, no considere la correspondencia, simplemente siga la dirección de la memoria de izquierda a derecha. Escriba los valores en orden de menor a mayor y complételos byte por byte. método de palabra doble 0x01020304 (DWORD) en la memoria Dirección de memoria 4000 4001 4002 4003 LE 04 03 02 01 BE 01 02 03 04 Explicación de LE y BE en MSDN Orden de bytes Orden de bytes Significado big-endian El byte más significativo está en el. extremo izquierdo de una palabra. El byte más significativo está en el extremo derecho de una palabra. El byte más importante aquí puede interpretarse como el valor más alto. Si es dinero, es el bit más valioso. Por ejemplo, tengo 1234 yuanes y el bit más valioso es 1000 yuanes. El menos valioso es 4 yuanes, por lo que este 1 es el byte más importante
Máquina big endian: piensa en el primer byte que lee. es la máquina little endian más grande: cree que el primer byte que lee es el más pequeño. Por ejemplo, a partir de la dirección de memoria 0x0000, existen los siguientes datos 0x0000 0x120x0001 0x340x0002 0xab0x0003 0xcd. 0x0000, si el orden de bytes es big-endian, el resultado de lectura será 0x1234abcd; si el orden de bytes es little-endian, el resultado de lectura es 0xcdab3412. Si escribimos 0x1234abcd en la memoria comenzando con 0x0000, el resultado es grande. -endian little-endian0x0000 0x12 0xcd0x0001 0x23 0xab0x0002 0xab 0x340x00 03 0xcd 0x12x86 Las CPU de la serie tienen un orden de bytes little-endian.