Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
script:python:xtra [2011/09/24 15:13] alfred |
script:python:xtra [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 141: | Línea 141: | ||
| - | ==== Decodificando datos binarios ==== | ||
| - | === Módulo binascii === | ||
| - | Existe el módulo ''binascii'' que trae distintas funciones para recoger los datos en un formato u otro: | ||
| - | <code python> | ||
| - | binascii.b2a_base64(data) | ||
| - | binascii.b2a_hex(data) | ||
| - | binascii.b2a_uu(data) | ||
| - | binascii.crc32(data, 0) | ||
| - | binascii.hexlify(data) | ||
| - | </code> | ||
| - | === Modulo array === | ||
| - | * [[http://docs.python.org/library/array.html]] | ||
| - | También podemos hacerlo mediante el módulo ''array'', este define un objeto con un tipo concreto (caracteres, integers, floats...) el cual se indica en la creación que es de la siguiente forma: | ||
| - | <code python> | ||
| - | import array | ||
| - | a = array.array('c', data) | ||
| - | </code> | ||
| - | Siendo el primer parámetro pasado (''c'' en este caso) el tipo que es. Los tipos se definen por (c (caracter a partir de un byte), b, B, u, h (short a partir de dos bytes), H, i (integer a partir de dos bytes), I, l (long a partir de cuatro bytes), L, f (float a partir de cuatro bytes), d (doubles a partir de cuatro bytes)). | ||
| - | === Modulo struct === | ||
| - | * [[http://docs.python.org/library/struct.html]] | ||
| - | Muy útil para la extracción de datos tipados de una cadena en bytes, y viceversa, pasar datos a cadena de bytes. \\ | ||
| - | Para recoger datos utilizamos la función ''unpack'' a la cual se le pasa un formato (que se forma a partir de los valores de la siguiente tabla) y la cadena de bytes: | ||
| - | ^ format ^ tipo leido ^ numero de bytes ^ | ||
| - | | c | char | 1 | | ||
| - | | b | byte | 1 | | ||
| - | | B | ubyte | 1 | | ||
| - | | h | short | 2 | | ||
| - | | H | ushort | 2 | | ||
| - | | i | int | 4 | | ||
| - | | I | uint | 4 | | ||
| - | | l | long | 4 | | ||
| - | | L | ulong | 4 | | ||
| - | | q | long (64b) | 8 | | ||
| - | | Q | ulong (64b) | 8 | | ||
| - | | f | float | ? | | ||
| - | | d | double | 8 | | ||
| - | | s | char[] | 1 | | ||
| - | | p | char[] | 1 | | ||
| - | Con este formato podríamos indicar qué es lo que viene en la cadena de bytes pasada, por ejemplo, ''cHIII'' esperaría a leer de los bytes un carácter, un unsigned short y tres unsigned int, es decir, la cadena de bytes debería de tener 11 bytes. El ejemplo también lo podríamos escribir como ''cH3I'', el resultado sería una lista. En el siguiente ejemplo se tiene un array de bytes (''data'') y se sabe que el primer es un número y el segundo un carácter. Luego también habría otro byte, pero este se imprimiría en la siguiente línea: | ||
| - | <code python> | ||
| - | print struct.unpack("Bc", data[:2]) | ||
| - | print struct.unpack("B", data[2:3]) | ||
| - | </code> | ||
| - | El primer carácter del formato puede indicar hacia donde se dirigen los bytes, por ejemplo puede ser: | ||
| - | * ''!'': Como se envia por red. | ||
| - | * ''<'': Little-endian. | ||
| - | * ''>'': Big-endian. | ||
| - | Otras funciones útiles podrían ser ''calcsize'' que pasándole un formato indica qué tamaño debería de tener este: | ||
| - | <code python> | ||
| - | >>> struct.calcsize('hhl') | ||
| - | 8 | ||
| - | </code> | ||
| - | O también podemos aprovechar el tipo ''namedtuple'' para crear objetos: | ||
| - | <code python> | ||
| - | >>> from collections import namedtuple | ||
| - | >>> Student = namedtuple('Student', 'name serialnum school gradelevel') | ||
| - | >>> Student._make(unpack('<10sHHb', data)) | ||
| - | Student(name='raymond ', serialnum=4658, school=264, gradelevel=8) | ||
| - | </code> | ||
| - | |||
| - | Y si quisieramos leer de un archivo binario... | ||
| - | <code python> | ||
| - | >>> import struct | ||
| - | >>> f = file('test.chm','r') | ||
| - | >>> s = f.read(4*1 + 3*4) | ||
| - | >>> struct.unpack("4s3I", s) | ||
| - | ('ITSF', 3L, 96L, 1L) | ||
| - | </code> | ||
| ===== Sockets ===== | ===== Sockets ===== | ||