Leer bits?

Se expone todo lo relacionado con el lenguaje, desde lo más básico hasta lo no tanto.

Moderadores: gneuromante, Andres_age, Yzumi

Leer bits?

Notapor Andres_age » Sab Abr 23, 2005 20:56

Me estaba preguntando, dado que al final todo son bits, se podría "engañar" a Ada leyendo cualquier archivo con bytes o bits por ejemplo?
Había oido que se podía hacer el tipo "bit" con modulos y cosas así, pero no he sabido más. Alguien sabe como se podría implementar?
Andres_age
Moderador
Moderador
 
Mensajes: 121
Registrado: Sab Abr 02, 2005 22:40

Tipos modulares y arrays de booleanos

Notapor gneuromante » Sab Abr 23, 2005 21:57

Tienes dos opciones para manerjar datos a nivel de bits: los enteros modulares (sin signo) y los arrays de booleanos empaquetados.

Código: Seleccionar todo
type byte is mod 2**8;


o

Código: Seleccionar todo
type byte is array (1..8) of boolean;

pragma pack (byte); -- Con esto se consigue que los elementos del array ocupen lo minimo posible, para los boolean es un bit.


y luego

Código: Seleccionar todo
package byte_io is new ada.sequential_io (byte); -- Te permite leer byte a byte un archivo.

Tanto los tipos mod como los arrays de booleanos (esten empaquetado o no) tienen operaciones logicas a nivel de bits: and, or y xor.

¿Cual usar en cada caso? Pues cuando te interese interpretarlo el byte como entero, los tipos mod. Cuando te interese acceder con un indice a cada bit, los arrays de booleanos.
gneuromante
Gurú Moderador
Gurú Moderador
 
Mensajes: 194
Registrado: Mié Mar 09, 2005 0:34

Notapor Andres_age » Dom Abr 24, 2005 15:00

Muchas gracias!
Había pensado en hacer un tipo

Código: Seleccionar todo
type bit is (0,1);

for bit'Size use 1; --obligamos a que el tipo "bit" use solo un bit


Pero había oido que esto usaría un byte entero y solo modificaria el lsb (es decir, 00000001 y 00000000).
Andres_age
Moderador
Moderador
 
Mensajes: 121
Registrado: Sab Abr 02, 2005 22:40

Notapor gneuromante » Dom Abr 24, 2005 18:42

Si el compilador soporta las clausulas de representacion (el GNAT lo hace) entonces el tipo tiene justamente el tamaño en bits que le dices con el 'Size.

El tipo que has puesto no es valido porque es un enumerativo cuyos identificadores son números, pero podrías definir tu tipo bit de cualquiera de estas tres maneras:
Código: Seleccionar todo

type bit is range 0..1;

type bit is new Boolean;

type bit is (cero, uno);

for bit'size use 1;
gneuromante
Gurú Moderador
Gurú Moderador
 
Mensajes: 194
Registrado: Mié Mar 09, 2005 0:34

Notapor Andres_age » Dom Jul 03, 2005 13:53

Bueno, me he puesto a practicar un poco con esto de bytes y demás.
No se si ya existe algún paquete que lo implemente (seguramente sí), pero si a alguien le interesa, o no encuentra, aquí está mi versión.
http://eld.iespana.es/d_byte.zip

Si da error 404, id a
http://eld.iespana.es/
y bajaros el archivo d_byte.zip

Basicamente trae lo siguiente:

- Posibilidad de crear y modificar bytes y bits.
- Operaciones entre bytes y bits: crear bytes a partir de bits, modificar determinados bits de un byte, ver los bits de un byte.
- Conversión entre bytes y enteros (de 0 a 255), conversión entre bytes y carácteres, conversión entre btts y enteros (0 o 1). Viceversa también, evidentemente.
- Manejo de ficheros directos y secuenciales de bytes.
Realmente solo uso Direct_IO, que permite tratar los ficheros tanto de forma secuencial como directa :P Se incluye el tipo "Fichero binario" que sustituye a File_Type (también se puede instanciar direct_io o sequential_io con el tipo byte, pero ya que lo implemento... :P).
- In/out: implementadas todas las operaciones de direct_IO para los bytes. Había un parámetro "form" que no sabía para que servía y lo he quitado :P se usa exactamente igual que antes: open, read, write, close, etc.
- Soporte de excepciones: copiadas de direct_IO :P
- No requiere instanciación ni cosas raras. Se hace un with/use de d_byte en vuestro programa y a usarlo sin problemas.


Dado que uso las operaciones de direct_IO y demás, al final hice el paquete en inglés. Me parecía un poco cutre hacer "open(Fichero_binario,Modo,Ruta)" e ir mezclando algunas cosas en inglés y en castellano. Para mí o todo en castellano (excepto la sintaxis de ada, evidentemente) o todo en inglés. Mis conocimientos de la lengua de Shakespeare tampoco son muy grandes, así que seguro que tengo varias faltas de ortografía :P

Comentarios con precondition y postcondition. Como ya dije en el otro post, quiero practicar este sistema de comentarios.

Tiene un par de ejemplos, un programa que copia un archivo de un lugar a otro y otro programa que cifra un archivo mediante el método cesar (muy cutre, pero sencillo para ver como funciona).

También estoy realizando la documentación del TAD (ya se, esto se tiene que hacer antes :P) pero me gustaría que fueseis mirandolo y me dijearais si veis fallos, si no os gusta, si lo hubierais hecho de otra forma, etc.

Lo dicho, espero que le sirva a alguien. Supongo que ya habrá implementaciones de bytes y bits, seguramente más completas que esta, pero quería practicar un poco (y lo necesito para un proyecto "secreto" que tengo en mente :roll: ;)).
Última edición por Andres_age el Dom Jul 10, 2005 20:39, editado 1 vez en total
Andres_age
Moderador
Moderador
 
Mensajes: 121
Registrado: Sab Abr 02, 2005 22:40

Notapor gneuromante » Dom Jul 10, 2005 13:59

Andres_age, como siempre tus posts son muy interesantes.

Me gustaría echarle un vistazo a tu código, pero el enlace no funciona. Si tienes problemas con el alojamiento, pídele a Flash_noi que lo aloje en canalada.org, que seguramente estará encantado de hacerlo.
gneuromante
Gurú Moderador
Gurú Moderador
 
Mensajes: 194
Registrado: Mié Mar 09, 2005 0:34

Notapor gneuromante » Dom Jul 10, 2005 14:52

No sé que ha pasado antes, que no he podido acceder en tres o cuatro ocasiones, pero después de entrar desde eld.iespana.es, puedo acceder con este enlace. Aun así, estaría bien poner en la web un repositorio de código Ada de los miembros del foro/canal.
gneuromante
Gurú Moderador
Gurú Moderador
 
Mensajes: 194
Registrado: Mié Mar 09, 2005 0:34

Notapor Andres_age » Dom Jul 10, 2005 20:37

Parece que ya no permiten bajar archivos estos de iespana :-(

La verdad el poder subir nuestros códigos a canal ada lo veo una opción muy interesante. A ver que dice Flash_noi al respecto!
Si interesa para la web, os puedo pasar el código fuente de una práctica que hicimos este año para base de datos, un repositorio de archivos para una web, con sistema de usuarios, control de versiones de un mismo archivo, categorías, busqueda avanzada, comentarios, etc. Está en PHP y va con MySQL.
Aqui están las características :P
http://www.protonsystems.net/usuarios/j ... ca2005.pdf
Aqui la practica que mi compañero aprovechó para su pagina :P
http://www.neworderkillers.com/inicio.p ... er&tip=all
Simplemente la pongo por si el diseño que usais de haran no implementa una sección de descargas/repositorio (no se si es un template para el diseño, o si es una web entera tipo phpnuke). Lo digo porque esto ya está todo hecho, aunque como inconveniente no hemos tenido muy en cuenta la seguridad (era una practica de universidad, al fin y al cabo)... si no os interesa/sirve, entonces nada, olvidadlo.

Bueno, siento haberme desviado tanto :P
He subido una versión con una operación que me había olvidado y la documentación (no es gran cosa, pero bueno) (el link está en mi respuesta anterior).
Por ahora solo se puede bajar de iespana, simplemente porque no hay muchas opciones mejores :P
Andres_age
Moderador
Moderador
 
Mensajes: 121
Registrado: Sab Abr 02, 2005 22:40

Notapor Andres_age » Lun Jul 18, 2005 21:34

He agregado operaciones de lógica booleana, ya se pueden hacer AND, OR, NOT y XOR entre bits y entre bytes.
Andres_age
Moderador
Moderador
 
Mensajes: 121
Registrado: Sab Abr 02, 2005 22:40


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron