2011-09-16 24 views
5

Tôi có Base64 dữ liệu được mã hóa từ thử nghiệm. Vì vậy, những gì tôi đang cố gắng thực hiện trong từng bước là:giải mã, ít endian, uncompressed và phao mảng

  • Lấy byte từ mã hóa base64 (Decode nó)
  • Chuyển byte thành ít về cuối nhỏ
  • Decompress byte từ (zlib)
  • Chuyển đổi byte mảng nổi mảng

Ví dụ:

Dn3LQ3np4kOyxQJE20kDRBRuFkScZB5ENxEzRFa+O0THMz9EOQRCRFC1QkRYeUNEwXJJROfbSUScvE5EVDtVRK5PV0TLUWNE481lRHX7ZkSBBWpE9FVyRIFdeESkoHhEnid8RI1nfUSy4YBE/C2CRGKQg0RcR4RE54uEROUAhUTBWodErKyMRNsVkkRvUpJEukWURO58lkSqRZ1E2VauRPBTwEQf9cVE9BnKRA==

Những gì tôi đã cố gắng cho đến nay

import os 
import base64 
import struct 

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

tmp_size=len(decode)/4 

Bây giờ tôi đang cố gắng để chuyển đổi các byte để little endian từ đây.

Tôi muốn thực hiện thao tác tiếp theo trong Python.

Tôi đang cố gắng tìm ra chính bản thân mình nhưng, mất quá nhiều thời gian.

Cảm ơn!

+0

Bạn đã thử gì? Bạn gặp vấn đề ở đâu? Chúng tôi sẽ giúp bạn với bất kỳ câu hỏi cụ thể nào mà bạn có, nhưng chúng tôi sẽ không viết mã cho bạn. – Oded

+0

Tôi đánh giá cao từ của bạn! – thchand

+0

Nếu bạn thực sự đánh giá cao nó, vui lòng _edit_ câu hỏi của bạn và thêm thông tin được yêu cầu. – Oded

Trả lời

4

Dường như dữ liệu của bạn không thực sự được nén. Đọc dữ liệu dưới dạng phao nổi trong vòng lặp sử dụng struct.unpack_from() hoặc làm một cấu trúc lớn bằng cách sử dụng 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 

Nếu dữ liệu được nén, giải nén nó.

import zlib 

decompressed = zlib.decompress(data) 
+0

xem xét sử dụng ''<% df'% count' thay vì' '<' + 'f' * count' –

+0

Ah , không biết chúng ta có thể sử dụng nó theo cách đó. Dường như làm việc quá. Cảm ơn vì tiền hỗ trợ. –

+0

Đây chỉ là một ví dụ, dữ liệu có thể được nén hoặc không nén! – thchand

1

Chuyển byte thành ít về cuối nhỏ

Byte đặt hàng chỉ áp dụng cho các kiểu dữ liệu có lớn hơn 1 byte. Vì vậy, bạn không thể chỉ chuyển đổi một danh sách các byte thành little-endian. Bạn cần phải hiểu những gì có trong danh sách các byte của bạn.

Số nguyên 32 bit là 4 byte; Nếu bạn có 16 byte dữ liệu. Bạn có thể "giải nén" thành 4 số nguyên 32 bit.

Nếu dữ liệu chỉ ascii văn bản endianness không quan trọng, đó là lý do tại sao bạn có thể đọc chính xác cùng một tập tin văn bản ascii trên cả hai máy lớn-endian và little-endian.

Dưới đây là một ví dụ minh hoạ struct.pack và 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] 

kiểm tra ra các tài liệu cho biết thêm: http://docs.python.org/library/struct.html#format-strings

0

Hình như bước tiếp theo của bạn sẽ được sử dụng struct. Một cái gì đó như thế này:

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

Ví dụ này sẽ biến bốn byte đầu tiên là decode thành phao. Hãy xem struct documentation để biết thêm thông tin về chuỗi định dạng, v.v.

Các vấn đề liên quan