2011-09-16 5 views
5

Mam Base64 zakodowane dane z eksperymentu. Więc to, co próbuję robić w etapową jest:dekodowanie, mała końcówka, nieskompresowana i zmienna tablica

  • Odzyskaj bajtów z kodowania base64 (dekodować go)
  • Konwersja bajtów little-endian
  • dekompresji bajtach od (zlib)
  • Konwersja bajt tablicy unosić Array

Przykład:

Dn3LQ3np4kOyxQJE20kDRBRuFkScZB5ENxEzRFa+O0THMz9EOQRCRFC1QkRYeUNEwXJJROfbSUScvE5EVDtVRK5PV0TLUWNE481lRHX7ZkSBBWpE9FVyRIFdeESkoHhEnid8RI1nfUSy4YBE/C2CRGKQg0RcR4RE54uEROUAhUTBWodErKyMRNsVkkRvUpJEukWURO58lkSqRZ1E2VauRPBTwEQf9cVE9BnKRA==

Co Próbowałem tak daleko

import os 
import base64 
import struct 

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

tmp_size=len(decode)/4 

Teraz próbuję przekonwertować te bajt little endian stąd.

Chcę wykonać następną operację w Pythonie.

Próbuję to rozgryźć, ale zajmuje to zbyt dużo czasu.

Dzięki!

+0

Co próbowaliście? Gdzie masz problemy? Pomożemy Ci uzyskać szczegółowe pytania, ale nie będziemy pisać Twojego kodu. – Oded

+0

Doceniam twoje słowo! – thchand

+0

Jeśli naprawdę to docenisz, proszę _poproś o swoje pytanie i dodaj wymagane informacje. – Oded

Odpowiedz

4

Wygląda na to, że Twoje dane nie są faktycznie skompresowane. Odczytaj dane jako pływające w pętli, używając struct.unpack_from() lub jako jedną dużą strukturę z wykorzystaniem 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 

Jeśli dane są skompresowane, rozpakuj je.

import zlib 

decompressed = zlib.decompress(data) 
+0

rozważ użycie opcji '' <% df '% count' zamiast '' <'+' f '* count' –

+0

Ah , nie wiedziałem, że możemy go użyć w ten sposób. Wydaje się też działać. Dzięki za wskazówkę. –

+0

To tylko przykład, dane mogą być kompresowane lub nieskompresowane! – thchand

1

Konwersja bajtów little-endian

Byte zamawiania odnosi się tylko do typów danych, które są większe niż 1 bajt. Więc nie możesz po prostu konwertować listy bajtów na little-endian. Musisz zrozumieć, co znajduje się na twojej liście bajtów.

32-bitowa liczba całkowita to 4 bajty; Jeśli masz 16 bajtów danych. Można "rozpakować" to na 4 32-bitowe liczby całkowite.

Jeśli dane są po prostu tekstem ascii, endianness nie ma znaczenia, dlatego można przeczytać dokładnie ten sam plik tekstowy ascii na maszynach big-endian i little-endian.

Oto przykład wykazując struct.pack i 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] 

sprawdzeniu dokumentacji Więcej informacji: http://docs.python.org/library/struct.html#format-strings

0

wygląda następnym krokiem będzie wykorzystanie struct. Coś takiego:

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

Ten przykład zamieni pierwsze cztery bajty decode do pływaka. Sprawdź numer struct documentation, aby uzyskać więcej informacji na temat ciągów formatów, itp.