En primer lugar, creo que esta cuestión no es independiente. Pero también se puede utilizar en otros idiomas como C. Estoy tratando de analizar un formato de archivo que almacena números enteros en formato de 4 bytes little-endian. TBH, no sé cómo funciona el formato little-endian ni el formato big-endian. Pero necesito convertirlos en una variable usable int. Por ejemplo, 02 00 00 00 2 Hasta ahora, tengo este código para convertir los primeros 2 bytes: (He utilizado FileStream. Read para almacenar los datos sin formato en una variable de buffer) Pero sólo convertir los dos primeros bytes. (02 00 en el ejemplo, no 02 00 00 00) Se agradecerá cualquier tipo de ayuda:) Windows en Intel / AMD es little-endian también, por lo que no se requiere conversión de endianness. Ahora, si puede mostrar el registro específico y de dónde obtiene los datos binarios, será más fácil responder. Puede leer cualquier tipo de registro de un archivo. Si su registro se declara así que tiene exactamente la misma disposición que los datos binarios, usted puede leer un expediente entero a la vez. Si no, usted tendrá que leer cada campo por separado. Por lo general, puede leer registros o campos individuales de un registro de una secuencia utilizando Si sus datos proceden de un socket TCP, puede, por ejemplo, escribirlo en un TMemoryStream, como bytes. A continuación, puede restablecer el puntero de la secuencia al principio y leer los datos como se muestra. Actualización Como David comentó, si los bytes vienen sobre la conexión TCP en el orden de bytes de la red, entonces tiene sentido para ejecutar cada campo a través de una de las funciones de WinSock ntohs () o ntohl (). Después de todo lo anterior, pero antes de que los elementos en el registro se utilizan. Ntohs () convierte 2 tipos de bytes, mientras que ntohl () convierte los tipos de 4 bytes. Para enviar elementos, utilice las funciones inversa htons () y htonl () en cada elemento del registro antes de enviarlos (por separado). FWIW, es muy fácil, en Win32, cambiar endianness usando: Endianness: Big y Little Endian Byte Orden Bi (Big / Little) Endian Los procesadores Bi-Endian se pueden ejecutar en cualquiera de los modos, pero sólo se puede elegir un modo para la operación , No hay orden de byte bi-endian. Orden de bytes es grande o poco endian. Orden de bytes de red: El orden de bytes Big Endian ha sido elegido como el neutro o estándar para el intercambio de datos de red y, por lo tanto, el orden de bytes Big Endian también se conoce como Orden de Byte de Red. Así, los sistemas Little Endian convertirán su representación Little Endian interna de datos en ordenamiento de bytes Big Endian al escribir en la red a través de un socket. Esto también requiere que los sistemas Little Endian cambien el orden de bytes cuando se lee desde una conexión de red. Lenguajes como Java lo gestionan para que el código Java pueda ejecutarse en cualquier plataforma y los programadores no tienen que gestionar el orden de los bytes. Es importante observar el Orden de Bytes de Red no solo para soportar hardware heterogéneo, sino también para soportar lenguajes heterogéneos. Orden de bytes y representación de datos en memoria: Big endian se refiere al orden en el que los bytes más significativos vienen primero. Esto significa que los bytes que representan los valores más grandes vienen primero. Los enteros regulares se imprimen de esta manera. El número 1025 muestra el numeral primero que representa 1000. Esta es una representación más cómoda para los seres humanos. Este valor más significativo primero se representa en bytes para la representación de la memoria del ordenador. El número 1025 se representa en hexadecimal como 0x0401 donde 0x0400 representa 1024 y 0x0001 representa el número 1. La suma es 1025. El byte más significativo (de mayor valor) se enumera primero en esta representación big endian. Uno puede ver que el tamaño de la palabra es un factor, así como determina cuántos bytes se utilizan para representar el número. El ordenamiento de bytes de Endian afecta a los datos de números enteros y de punto flotante, pero no afecta a las cadenas de caracteres, ya que mantienen el orden de las cadenas según lo visto y previsto por el programador. 16 bits representación en memoria: Big Endian: Hex: 0x0401 binario: 00000100 00000001 Little Endian: Hex: 0x0104 binario: 00000001 00000100 32 bits representación en la memoria: Big Endian: Hex: 0x00000401 binario: 00000000 00000000 00000100 00000001 Little Endian: Hex: 0x01040000 Binario: 000000000 000000000 00000000 00000000 Representación de 32 bits en la memoria Big Endian Hex: 0x00020804 binario 64 bits representación en memoria Big Endian Hex: 0x0000010000040880 binario 00000000 00000000 00000001 00000100 00000100 00001000 10000100 Little Endian Hex: 0x8008040000010000 binario: 10000100 00001000 00000100 00000000 00000100 00000001 00000000 00000000 Tenga en cuenta que los bytes que representan el número entero se intercambian. También tenga en cuenta que sólo los bytes se invierten y los bits dentro del byte no se invierten. Conversión y Swapping Bytes: El intercambio de bytes para convertir el endianness de datos binarios puede lograrse utilizando las siguientes macros, rutinas o bibliotecas. La máquina virtual Java opera en modo big endian en todas las plataformas y, por lo tanto, es a menudo inmune a los efectos de la arquitectura del procesador. Sin embargo, los archivos de datos a menudo sufren los efectos del hardware. Incluso los estándares de formato de archivo pueden verse afectados, por ejemplo, los archivos de datos como JPEG se almacenan en formato Big Endian mientras que GIF y BMP se almacenan en formato Little Endian. Los números enteros, los datos de punto flotante (sistemas modernos) y los datos de campo de bits se intercambian bytes para convertir entre grandes y pequeños sistemas endianos. El texto ASCII no lo es. Esto se debe a la representación interna de los datos numéricos y al método en el que se procesa. Tenga en cuenta que la representación de datos en coma flotante entre un sistema antiguo y un procesador basado en punto flotante IEEE más reciente requiere una conversión de formato antes de que se considere el orden de bytes (por ejemplo, transferencia flotante entre mainframes System 390 y sistemas basados en Intel). C para intercambiar bytes en sistemas little endian: Los bytes también se pueden intercambiar mediante programación, pero esto es más lento que el de la macro operación mostrada pero aplicable a otros tamaños de palabras, en este caso 128 bits: Para un número de bytes especificado por el usuario: Bibliotecas de intercambio de bytes: hay bibliotecas de intercambio de bytes que se incluyen con la mayoría de las bibliotecas C / C. Las rutinas más utilizadas son htons () y ntohs () utilizadas para las conversiones de orden de bytes de red. El anfitrión de rutinas Big / Little Endian (htobe16 () / be16toh (), etc) son más completos ya que manejan swaps de 2, 4 y 8 bytes. Estas rutinas son independientes de la plataforma y saben que un swap sólo es necesario en los sistemas Little Endian. No se aplica intercambio a los datos cuando se ejecutan en un equipo host Big Endian ya que los datos ya están en orden de bytes de red. Htons () / ntohs () y htonl () / ntohl (). Convertir valores entre el host y el orden de bytes de la red uint16t htons (uint16t): convierte el entero corto sin signo del orden de los bytes del host al orden de los bytes de la red. Uint16t ntohs (uint16t): convierte el entero corto sin signo de orden de bytes de red en orden de bytes de host. Uint32t htonl (uint32t): convierte el entero largo sin signo del orden de los bytes del host al orden de los bytes de la red. Uint32t ntohl (uint32t): convierte el entero largo sin signo de orden de bytes de red en orden de bytes de host. Htobe16 () / be16toh (), también 32 y 64 bits. Convertir los valores entre el host y el orden de bytes big-little-endian uint16t htobe16 (uint16t host16bits): Host a Big Endian swap 16 bits uint16t htole16 (uint16t host16bits): Host a Little Endian swap 16 bits uint16t be16toh (uint16t bigendian16bits): Big Endian A Host swap 16 bits uint16t le16toh (uint16t littleendian16bits): Pequeño Endian a Host swap 16 bits uint32t htobe32 (uint32t host32bits) uint32t htole32 (uint32t host32bits) uint32t be32toh (uint32t littleendian32bits) uint32t u32eh (uint32t littleendian32bits) uint64t htobe64 (uint64t host64bits) uint64t Htole64 (uint64t host64bits) uint64t be64toh (uint64t bigendian64bits) uint64t salida le64toh (uint64t littleendian64bits) cuando se ejecuta en un sistema Little Endian: Otras opciones menos dignas: En GCC (no portátil) puede llamar directamente: int32t builtinbswap32 int32t int64t (Int64t x) Librerías, funciones y macros de conversión de endian adicionales: macros de órdenes de bytes de Gnome Funciones de orden de bytes de Qt Ver macros en archivos de inclusión linux / kernel. h (int64t x) Macros en byteswap. h int32t bswap32 (int32t x) int64t bswap64 Y asm / byteorder. h (/usr/include/linux/byteorder/littleendian. h tiene macros reales): le16tocpu (), cputole16 (), be16tocpu () y cputobe16 () para variables de 16, 32 y 64 bits. También vea las versiones que toman un puntero como argumento. Las versiones de la macro tienen valores de retorno de función, así como valores de retorno de argumento. Boost endian macros - Véase boost / detail / endian. hpp Conversiones de campo de bit: Bit Las estructuras de datos de campo son representadas por el compilador en el orden opuesto en los sistemas Big y Little Endian. Tenga en cuenta el uso de la macro para determinar la endianess del sistema y, por tanto, qué orden del campo de bits a utilizar. La estructura está escrita para uso en plataformas cruzadas y puede usarse en sistemas Big y Little Endian. Las siguientes macros manejarán las diferencias en la representación de campo de bit entre sistemas grandes y pequeños de endian. La estructura del campo de bits requiere un intercambio de bytes para manejar la traducción de endian. Aunque este uso de las sentencias de definición de macros se ajustará a los matices del campo de bits, no cambiará los bytes que aún deben producirse al intercambiar datos. Uno puede usar macros para definir bits en orden opuesto en grandes y pequeños sistemas endian o uno puede invertirlos programáticamente. Pruebas y ejemplos: Pruebe las posiciones de campo del bit: Compile: g bitOrderStruct. cpp Ejecutar: ./a. out Resultados de la arquitectura Intel x8664 little endian: G4 PPC y SunOS 5.8 sun4 sparc sun-blade 2500: Mi herramienta más utilizada cuando se trabaja con Bit y la visualización de bits es kcalc la calculadora KDE que puede ver los datos como bits, bytes hexadecimales, octal y como números decimales. Instalación (Ubuntu): apt-get install kcalc Cuando trabajo con grandes cantidades de datos, encuentro que el editor hexadecimal de Gnome es útil. Instalación (Ubuntu): apt-get install ghex C Cómo programar por Harvey M. Deitel, Paul J. Deitel ISBN 0131857576, Prentice Hall Quinta edición. La primera edición de este libro (y el profesor Sheely en UTA) me enseñó a programar C. Es completa y cubre todos los matices del lenguaje C. También tiene buenos ejemplos de código. Bueno tanto para el aprendizaje y la referencia. C: 47 Ingeniería Rompecabezas, Problemas de Programación y Soluciones por Herb Sutter ISBN 0201615622, Addison-Wesley Profesional Avanzado C características y STL. Más C Excepcional por Herb Sutter ISBN 020170434X, Addison-Wesley Profesional Eficaz C: 50 Maneras Específicas de Mejorar Sus Programas y Diseño (2da Edición) por Scott Meyers ISBN 0201924889, Addison-Wesley Profesional Más Eficaz C: 35 Nuevas Maneras de Mejorar sus Programas Y diseños de Scott Meyers ISBN 020163371X, Addison-Wesley Profesional
No comments:
Post a Comment