Pregunta

Actualmente estoy tratando de aprender algunas cosas más profundas de formatos de archivo.

Tengo una especificación para un formato de archivo 3D (U3D en este caso) y quiero intentar implementarlo. Nada serio, solo para el efecto de aprendizaje.

Mi problema comienza muy temprano con los tipos, que deben definirse. Tengo que definir diferentes enteros (8 bits, 16 bits, 32 bits sin firmar y firmados) y luego deben convertirse a hex antes de escribirlo en un archivo.

¿Cómo defino estos tipos, ya que no puedo simplemente crear un I16 IE? Otro problema para mí es cómo convertir ese i16 a un número hexadecimal con 8 dígitos (es decir, 0001 0001).

¿Fue útil?

Solución

Hex es solo una representación de un número. Si interpreta el número como binario, decimal, hexadecimal, octal, etc. depende de usted. En C ++ tiene apoyo para representaciones decimales, hexadecimales y octales, pero todos se almacenan de la misma manera.

Ejemplo:

int x = 0x1;
int y = 1;
assert(x == y);

Probablemente el formato de archivo desee que almacene los archivos en formato binario normal. No creo que el formato de archivo quiera los números hexadecimales como una cadena de texto legible. Si es así, entonces podría usar std :: hex para hacer la conversión por usted. (Ejemplo: file << hex << number;)

Si el formato de archivo habla sobre escribir más de un tipo de 1 byte para archivar, entonces tenga cuidado con el Endiannessidad de tu arquitectura. Lo que significa que almacena el byte más significativo del tipo de bytes múltiples primero o el último.

Es muy común en las especificaciones de formato de archivo para mostrarle cómo el binario debe buscar una parte determinada del archivo. Sin embargo, no confunda esto con el almacenamiento de dígitos binarios como cuerdas. Del mismo modo, a veces dan un atajo para esto especificando en hex de Hex cómo debería verse. De nuevo, la mayoría de las veces no se refieren a las cuerdas de texto.

La unidad más pequeña direccionable en C ++ es una char que es 1 byte. Si desea establecer bits dentro de ese byte, debe usar operadores bit a bit como & y |. Hay muchos tutoriales sobre operadores bitwise, por lo que no entraré en detalles aquí.

Otros consejos

Si incluye <stdint.h> Obtendrá tipos como:

uint8_t
int16_t
uint32_t

Primero, déjame entender. Los enteros se almacenan como texto en un archivo, en formato hexadecimal, sin prefijo 0x?

Luego, use esta sintaxis:

fprintf (fp, "%08x", número);

Escribirá 0ABC1234 en un archivo.

En cuanto a "Definir diferentes enteros (8 bits, 16 bits, 32 bits sin firmar y firmado)", a menos que enrolle los suyos y las operaciones de matemáticas concomitantes para ellos, debe atenerse a los tipos suministrados por su sistema. Consulte stdint.h para los typedefs disponibles, como int32_t.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top