He visto innumerables referencias sobre endianness y lo que significa. No tengo ningún problema con eso ... Sin embargo, mi proyecto de codificación es un juego simple para ejecutar en Linux y Windows, en hardware "gamer" estándar. ¿Debo preocuparme por el endianness en este caso? ¿Cuándo debería preocuparme por eso? Mi código es simple C y SDL + GL, los únicos datos complejos son archivos multimedia básicos (png + wav + xm) y los datos del juego son principalmente cadenas, booleanos enteros (para banderas y similares) y matrices de tamaño estático. Hasta ahora ningún usuario ha tenido problemas, por lo que me pregunto si es necesario agregar cheques (se hará más tarde, pero hay más problemas urgentes de OMI).¿Cuándo preocuparse por endianness?
Respuesta
Si se refiere a una PC por "hardware estándar de jugador", entonces no tiene que preocuparse por la endianidad, ya que siempre será little endian en x86/x64. Pero si desea trasladar el proyecto a otras arquitecturas, debe diseñarlo de manera independiente.
Esto es pasar por alto el área más importante de los problemas endian: programación de red. Siempre convierta entre el host y el orden de bytes de la red al enviar valores de múltiples bytes (como int o long). – gnud
Buen punto, debe usar 'hton' y funciones similares al programar sockets. Pero normalmente usarías bibliotecas que abstraen estas diferencias. – AndiDog
@gnud: no, eso está mal. Si espera que todos sus servidores y clientes sean poco endian, es conveniente definir un formato o protocolo que incluya valores little-endian de múltiples bytes. Esto sucede cada vez que se envía un archivo ZIP a través de la red, ya que los números mágicos y tamaños en PKZIP son poco endian, no orden de la red. No se ha estrellado todavía.Si alguna vez necesita un cliente o servidor de big-endian, puede cambiar byte de forma segura según sea necesario. 'hton' es necesario para especificar direcciones IP y puertos, y es una forma conveniente de especificar formatos de datos endian-safe, pero no es la única. –
Sólo tiene que preocuparse por ello si su juego necesita para funcionar en diferentes arquitecturas de hardware. Si está seguro de que siempre se ejecutará en el hardware de Intel, entonces puede olvidarse de eso. Si se ejecutará en Linux, aunque muchas personas usan arquitecturas diferentes a las de Intel y es posible que termine teniendo que pensar en ello.
¿Está distribuyendo su juego en forma de código fuente?
Porque si se va a distribuir el juego, ya que sólo un binario, entonces usted sabe exactamente qué familias procesador de su juego se ejecutará en. Además, los archivos multimedia, ¿están generados por el usuario (posiblemente a través de un editor de niveles) o solo son para ser suministrados por usted mismo?
Si se trata de un entorno verdaderamente cerrado (sus binarios de distribución y los recursos del juego no están destinados a personalizarse), entonces conocerá sus propios riesgos para los endiagos y yo personalmente no me engañaré con eso.
Sin embargo, si se va a distribuir, ya sea de origen y/o con la esperanza de la gente va a personalizar su juego, entonces usted tiene un potencial de preocupación. Sin embargo, con la mayoría de las computadoras de escritorio/portátiles en estos días moviéndose a x86, creo que esto es una preocupación cada vez menor.
Tengo los archivos de datos "simplemente tendidos ahí" intencionalmente para que los usuarios tomen/editen/modifiquen/agreguen cosas. Los niveles usan un editor pero el resultado es una semilla y una cadena larga nuevamente (me acostumbré un poco a ellos). El resto es de procedimiento Es cierto que la versión que la mayoría de los usuarios tocarán será la de win32, que se precompilará en el momento de la distribución. (como anécdota solo he usado las compilaciones de Linux o fuente) Gracias por su respuesta. – GAKOKO
El problema ocurre con las redes y cómo los datos se envían y cuando usted está haciendo poco jugando en diferentes procesadores desde diferentes procesadores pueden almacenar los datos de forma diferente en la memoria.
Siempre que reciba/transmitir datos desde una red, remeber para convertir a/de la red y el host orden de bytes. Las funciones C htons
, htonl
etc., o equivalentes en su idioma, se deben usar aquí.
Siempre que lea valores de varios bytes (como caracteres UTF-16 o 32 bits) desde un archivo, ya que ese archivo podría haberse originado en un sistema con diferente endianness. Si el archivo es UTF 16 o 32, probablemente tenga una BOM (marca de orden de bytes). De lo contrario, el formato de archivo deberá especificar endianness de alguna manera.
creo Power PC tiene el orden de bits opuesto de las placas Intel. ¿Podría ser capaz de tener una rutina que establezca que la endiancia depende de la arquitectura? No estoy seguro si realmente puedes decir cuál es la arquitectura del hardware en código ... tal vez alguien más inteligente que yo sepa la respuesta a esa pregunta.
Ahora, en referencia a su declaración "estándar" de Gamer H/W, yo diría que normalmente las soluciones de Consumer Off the Shelf son realmente lo que casi cualquier usuario de Standard Gamer está usando, por lo que casi se está yendo para asegurarse de obtener el mismo endian en todos los ámbitos. Estoy seguro de que alguien no estará de acuerdo conmigo, pero ese es mi $.02
Ha ... Acabo de ver a la derecha hay un enlace que se muestra relacionado con la sugerencia que tenía arriba.
Los momentos en los que hay que preocuparse por endianess:
- va a enviar datos binarios entre máquinas o procesos (utilizando una red o un archivo). Si las máquinas pueden tener un orden de bytes diferente o el protocolo utilizado especifica un orden de bytes particular (que debería), tendrá que lidiar con endianess.
- tiene un código que accede a la memoria a través de punteros de diferentes tipos (digamos que tiene acceso a una variable
unsigned int
a través dechar*
).
Si haces estas cosas, estás tratando con la orden de bytes, lo sepas o no, puede ser que estés lidiando con eso asumiendo que es de una manera u otra, que puede funcionar bien siempre ya que su código no tiene que tratar con una plataforma diferente.
En una línea similar, generalmente debe tratar los problemas de alineación en esos mismos casos y por motivos similares. Una vez más, podría estar lidiando con eso sin hacer nada y haciendo que todo funcione bien porque no tiene que atravesar los límites de la plataforma (lo que puede volver a afectarlo si se convierte en un requisito).
- 1. Cuándo dejar de preocuparse por un navegador
- 2. MS Visual C++: ¿Cuándo debería preocuparse por usar las convenciones de llamadas?
- 3. ¿Por qué preocuparse por las últimas comas en Node.js?
- 4. Qt Sockets and Endianness
- 5. constexpr y endianness
- 6. Endianness en Unix hexdump
- 7. Cambiar endianness en PHP
- 8. ¿Por qué un campo de 8 bits tiene endianness?
- 9. Endianness en lenguajes de programación
- 10. cómo actualizar un registro sin preocuparse por la clave primaria
- 11. PNG formato de archivo endianness?
- 12. Endianness de enteros en Python
- 13. Intercambio de endianness sin ntohs
- 14. Conversión de endianness en ARM
- 15. Endianness and Socket Programming in C
- 16. ¿Por qué un programador de Java debería preocuparse por el error del año 2038?
- 17. ¿Por qué preocuparse por hacer un widget javascript/jquery puro cuando puedo cargarlo en un iframe?
- 18. Java: el reemplazo de DataInputStream endianness
- 19. Endianness de la máquina virtual de Java
- 20. ¿Cuándo desechar y por qué?
- 21. ¿Los modelos de rieles deberían preocuparse por otros modelos en aras de los controladores delgados?
- 22. Convertir la lista al diccionario utilizando linq y no preocuparse por los duplicados
- 23. Spinning un nuevo Tema - necesito para preocuparse por la recolección de basura
- 24. ¿Debería preocuparse por cuentas falsas/inicios de sesión en un sitio web?
- 25. Validación XML con XSD: ¿cómo evitar preocuparse por la secuencia de los elementos?
- 26. ¿Realmente los desarrolladores de ASP.NET deben preocuparse por la seguridad de los hilos?
- 27. ¿Vale la pena preocuparse por la licencia de MS Ribbon/Office UI?
- 28. ¿Hay alguna razón para preocuparse por el orden de las columnas en una tabla?
- 29. ¿De qué preocuparse cuando se usa NHibernate con WCF?
- 30. ¿Cuál es la forma más pitonica de determinar endianness?
Esta pregunta me recordó al difunto General Custer. No estoy seguro exactamente por qué ... – KristoferA
Las cadenas (de los archivos de recursos) pueden ser un problema si usa usando una codificación como UTF-16, donde cada valor básico es> 1 byte. – gnud
Gracias por sus respuestas. Es de código abierto, pero en su mayoría se espera que funcione con hardware de PC convencional (con toda honestidad acabo de hacer la versión de Linux porque es mi sistema operativo principal y me resulta más fácil cargarlo) ... básicamente x86. No hay datos en red y los archivos de guardado son cadenas largas muy simples (no agrego "guardar la defensa de pirateo" ... el jugador decide en última instancia y ellos harán trampa de todos modos). Los datos del juego están abiertos para ser editados o tomados por los usuarios. Eso significa que alguien que use un Mac para editar o agregar imágenes provocaría un bloqueo o algo peor. (errores sin salida clara de errores/errores) – GAKOKO