2011-09-16 10 views
5

Tengo Base64 datos codificados de un experimento. Así que lo que estoy tratando de hacer en el paso a paso es:descodificación, little endian, descomprimido y matriz flotante

  • Recuperar bytes de la codificación base64 (decodificarlo)
  • Convierte bytes a little-endian
  • Descomprimir bytes desde (zlib)
  • Convertir matriz de bytes flotar array

Ejemplo:

Dn3LQ3np4kOyxQJE20kDRBRuFkScZB5ENxEzRFa+O0THMz9EOQRCRFC1QkRYeUNEwXJJROfbSUScvE5EVDtVRK5PV0TLUWNE481lRHX7ZkSBBWpE9FVyRIFdeESkoHhEnid8RI1nfUSy4YBE/C2CRGKQg0RcR4RE54uEROUAhUTBWodErKyMRNsVkkRvUpJEukWURO58lkSqRZ1E2VauRPBTwEQf9cVE9BnKRA==

Lo que he intentado hasta ahora

import os 
import base64 
import struct 

s = 'Dn3LQ3np4kOyxQJE20kDRBRuFkScZB5ENxEzRFa+O0THMz9EOQRCRFC1QkRYeUNEwXJJROfbSUScvE5EVDtVRK5PV0TLUWNE481lRHX7ZkSBBWpE9FVyRIFdeESkoHhEnid8RI1nfUSy4YBE/C2CRGKQg0RcR4RE54uEROUAhUTBWodErKyMRNsVkkRvUpJEukWURO58lkSqRZ1E2VauRPBTwEQf9cVE9BnKRA==' 
decode=base64.decodestring(s) 

tmp_size=len(decode)/4 

Ahora estoy tratando de convertir estos bytes a little endian desde aquí.

Quiero hacer la siguiente operación en Python.

Estoy tratando de resolverlo por mí mismo, pero está tomando demasiado tiempo.

Gracias!

+0

¿Qué ha probado? ¿Dónde estás teniendo problemas? Te ayudaremos con cualquier pregunta específica que tengas, pero no escribiremos tu código por ti. – Oded

+0

¡Agradezco tu palabra! – thchand

+0

Si realmente lo aprecia, por favor _edit_ su pregunta y agregue la información solicitada. – Oded

Respuesta

4

Parece que sus datos no están realmente comprimidos. Lea los datos como flotantes en un bucle usando struct.unpack_from() o como una gran estructura usando struct.unpack().

import base64 
import struct 

encoded = 'Dn3LQ3np ... 9BnKRA==' 

# decode the string 
data = base64.standard_b64decode(encoded) 

# ensure that there's enough data for 32-bit floats 
assert len(data) % 4 == 0 

# determine how many floats there are 
count = len(data) // 4 

# unpack the data as floats 
result = struct.unpack('<{0}f'.format(count), # one big structure of `count` floats 
         data)     # results returned as a tuple 

Si los datos están comprimidos, descomprímalos.

import zlib 

decompressed = zlib.decompress(data) 
+0

considere usar ''<% df'% count' en lugar de' '<' + 'f' * count' –

+0

Ah , no sabía que podríamos usarlo de esa manera. Parece que también funciona. Gracias por el consejo. –

+0

¡Esto es solo un ejemplo, los datos se pueden comprimir o descomprimir! – thchand

1

convertir bytes a little-endian

orden de bytes sólo se aplica a los tipos de datos que son mayores que 1 byte. Entonces no puedes simplemente convertir una lista de bytes a little-endian. Necesita comprender lo que está en su lista de bytes.

Un entero de 32 bits tiene 4 bytes; Si tiene 16 bytes de datos. Podrías "descomprimir" eso en 4 enteros de 32 bits.

Si los datos son solo texto de texto, la endianidad no importa, es por eso que puede leer el mismo archivo de texto ascii en las máquinas big-endian y little-endian.

Aquí es un ejemplo que demuestra struct.pack y struct.unpack:

#!/usr/bin/env python2.7 
import struct 
# 32-bit unsigned integer 
# base 10  2,864,434,397 
# base 16  0xAABBCCDD 
u32 = 0xAABBCCDD 
print 'u32 =', u32, '(0x%x)' % u32 
# big endian 0xAA 0xBB 0xCC 0xDD 
u32be = struct.pack('>I', u32) 
bx = [byte for byte in struct.unpack('4B', u32be)] 
print 'big endian packed', ['0x%02x' % x for x in bx] 
assert bx == [0xaa, 0xbb, 0xcc, 0xdd] 
# little endian 0xDD 0xCC 0xBB 0xAA 
u32le = struct.pack('<I', u32) 
lx = [byte for byte in struct.unpack('4B', u32le)] 
print 'little endian packed', ['0x%02x' % x for x in lx] 
assert lx == [0xdd, 0xcc, 0xbb, 0xaa] 
# 64-bit unsigned integer 
# base 10  12,302,652,060,662,200,000 
# base 16  0xAABBCCDDEEFF0011 
u64 = 0xAABBCCDDEEFF0011L 
print 'u64 =', u64, '(0x%x)' % u64 
# big endian 0xAA 0xBB 0xCC 0xDD 0xEE 0xFF 0x00 0x11 
u64be = struct.pack('>Q', u64) 
bx = [byte for byte in struct.unpack('8B', u64be)] 
print 'big endian packed', ['0x%02x' % x for x in bx] 
assert bx == [0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11] 
# little endian 0x11 0x00 0xFF 0xEE 0xDD 0xCC 0xBB 0xAA 
u64le = struct.pack('<Q', u64) 
lx = [byte for byte in struct.unpack('8B', u64le)] 
print 'little endian packed', ['0x%02x' % x for x in lx] 
assert lx == [0x11, 0x00, 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa] 

salida la documentación para obtener más información: http://docs.python.org/library/struct.html#format-strings

0

Parece que el siguiente paso será utilizar struct. Algo como esto:

struct.unpack("<f", decode[0:4]) 

En este ejemplo se va a convertir los cuatro primeros bytes de decode en un flotador. Consulte struct documentation para obtener más información sobre cadenas de formato, etc.

Cuestiones relacionadas