我有来自实验的 Base64 编码数据。所以我试图逐步做的是:
示例:
Dn3LQ3np4kOyxQJE20kDRBRuFkScZB5ENxEzRFa+O0THMz9EOQRCRFC1QkRYeUNEwXJJROfbSUScvE5EVDtVRK5PV0TLUWNE481lRHX7ZkSBBWpE9FVyRIFdeESkoHhEnid8RI1nfUSy4YBE/C2CRGKQg0RcR4RE54uEROUAhUTBWodErKyMRNsVkkRvUpJEukWURO58lkSqRZ1E2VauRPBTwEQf9cVE9BnKRA==
到目前为止我尝试了什么
import os
import base64
import struct
s = 'Dn3LQ3np4kOyxQJE20kDRBRuFkScZB5ENxEzRFa+O0THMz9EOQRCRFC1QkRYeUNEwXJJROfbSUScvE5EVDtVRK5PV0TLUWNE481lRHX7ZkSBBWpE9FVyRIFdeESkoHhEnid8RI1nfUSy4YBE/C2CRGKQg0RcR4RE54uEROUAhUTBWodErKyMRNsVkkRvUpJEukWURO58lkSqRZ1E2VauRPBTwEQf9cVE9BnKRA=='
decode=base64.decodestring(s)
tmp_size=len(decode)/4
现在我正试图从这里将这些字节转换为小端。
我想在 Python 中进行下一步操作。
我想弄明白自己,但是花了太多时间。
谢谢!
答案 0 :(得分:6)
您的数据似乎未实际压缩。使用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 :(得分:1)
将字节转换为little-endian
字节排序仅适用于大于1个字节的数据类型。所以你不能只是将字节列表转换为little-endian。您需要了解字节列表中的内容。
32位整数是4个字节;如果你有16个字节的数据。您可以将其解压缩为4个32位整数。
如果数据只是ascii文本,则字节顺序无关紧要,这就是为什么你可以在big-endian和little-endian机器上读取完全相同的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
答案 2 :(得分:0)
您的下一步似乎是使用struct
。像这样:
struct.unpack("<f", decode[0:4])
此示例将decode
的前四个字节转换为浮点数。有关格式字符串等的更多信息,请查看struct documentation