2010-02-06 15 views
8

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?

+0

Esta pregunta me recordó al difunto General Custer. No estoy seguro exactamente por qué ... – KristoferA

+0

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

+0

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

Respuesta

2

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.

+6

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

+0

Buen punto, debe usar 'hton' y funciones similares al programar sockets. Pero normalmente usarías bibliotecas que abstraen estas diferencias. – AndiDog

+0

@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. –

1

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.

+3

Además, solo es importante cuando intercambia datos entre computadoras o cuando almacena datos en formato binario. –

+0

@Georg Ah, buen punto. Me olvidé de mencionar eso. – Cromulent

+0

o cuando transfiere datos en serie y debe elegir qué byte enviar primero. – JustJeff

1

¿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.

+0

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

0

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.

1

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.

0

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.

Find Endianness through a c program

5

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 de char*).

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).

Cuestiones relacionadas