декодирование, байты с прямым порядком байтов, несжатый и массив с плавающей точкой - PullRequest
6 голосов
/ 17 сентября 2011

У меня есть Base64 закодированные данные из эксперимента.Итак, что я пытаюсь сделать поэтапно:

  • Извлечь байты из кодировки base64 (Расшифровать его)
  • Преобразовать байты в младший порядок
  • Распаковать байты из(zlib)
  • Преобразование байтового массива в массив с плавающей точкой

Пример:

Dn3LQ3np4kOyxQJE20kDRBRuFkScZB5ENxEzRFa+O0THMz9EOQRCRFC1QkRYeUNEwXJJROfbSUScvE5EVDtVRK5PV0TLUWNE481lRHX7ZkSBBWpE9FVyRIFdeESkoHhEnid8RI1nfUSy4YBE/C2CRGKQg0RcR4RE54uEROUAhUTBWodErKyMRNsVkkRvUpJEukWURO58lkSqRZ1E2VauRPBTwEQf9cVE9BnKRA==

Что я пробовал до сих пор

import os
import base64
import struct

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

tmp_size=len(decode)/4

Теперь я пытаюсь преобразовать эти байты в младший порядковый номер отсюда.

Я хочу сделать следующую операцию в Python .

Япытаюсь понять это сам, но это занимает слишком много времени.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 17 сентября 2011

Похоже, ваши данные на самом деле не сжаты. Считайте данные как числа с плавающей точкой в ​​цикле, используя struct.unpack_from(), или как одну большую структуру, используя 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

Если данные сжаты, распакуйте их.

import zlib

decompressed = zlib.decompress(data)
1 голос
/ 17 сентября 2011

Преобразование байтов в младший порядок

Порядок байтов применяется только к типам данных, размер которых превышает 1 байт. Таким образом, вы не можете просто конвертировать список байтов в порядке байтов. Вы должны понимать, что находится в вашем списке байтов.

32-разрядное целое число составляет 4 байта; Если у вас есть 16 байтов данных. Вы можете «распаковать» это в 4 32-битных целых числа.

Если данные представляют собой просто текст ascii, порядок байтов не имеет значения, поэтому вы можете прочитать один и тот же текстовый файл ascii как на машинах с прямым порядком байтов, так и на машинах с прямым порядком байтов.

Вот пример, демонстрирующий struct.pack и 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]

Проверьте документацию для получения дополнительной информации: http://docs.python.org/library/struct.html#format-strings

0 голосов
/ 17 сентября 2011

Похоже, вашим следующим шагом будет использование struct. Как то так:

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

Этот пример превратит первые четыре байта decode в число с плавающей точкой. Обратитесь к документации структуры для получения дополнительной информации о строках формата и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...