Python 解码、小端、未压缩和浮点数组

Python 解码、小端、未压缩和浮点数组,python,base64,Python,Base64,我有一个实验的Base64编码数据。因此,我试图逐步做到的是: 从base64编码中检索字节(对其进行解码) 将字节转换为小尾数 从(zlib)解压缩字节 将字节数组转换为浮点数组 例如: DN3LQ3NP4KOYXQJE20KDRBRUFFSCZB5ENXEZRFA+O0THMZ9EOQRFC1QKRYEUNEWXJROFBUSCVE5EVDTVRK5PV0TLUWNE481LRHX7ZKBWPE9FVYRIFDEESKOHHENID4YBE/C2CRGKQG0RCR4RE54UERUOU

我有一个实验的Base64编码数据。因此,我试图逐步做到的是:

  • 从base64编码中检索字节(对其进行解码)
  • 将字节转换为小尾数
  • 从(zlib)解压缩字节
  • 将字节数组转换为浮点数组
例如:

DN3LQ3NP4KOYXQJE20KDRBRUFFSCZB5ENXEZRFA+O0THMZ9EOQRFC1QKRYEUNEWXJROFBUSCVE5EVDTVRK5PV0TLUWNE481LRHX7ZKBWPE9FVYRIFDEESKOHHENID4YBE/C2CRGKQG0RCR4RE54UERUOUAHUTBWODERKRKRKRKRKWKKKKKKWUKW58LKSKRZ1E2WUKV9CVE9BNKRA=

到目前为止我都试过了

import os
import base64
import struct

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

tmp_size=len(decode)/4
现在我试着从这里把这些字节转换成小尾端

我想在Python中执行下一个操作

我自己也在努力想办法,但这太费时了

谢谢

将字节转换为小尾数

字节排序仅适用于大于1字节的数据类型。所以你不能仅仅把一个字节列表转换成小尾端。您需要了解字节列表中的内容

32位整数为4字节;如果您有16个字节的数据。您可以将其“解压”为4个32位整数

如果数据仅仅是ascii文本,那么endian不重要,这就是为什么您可以在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]
#/usr/bin/env python2.7
导入结构
#32位无符号整数
#基地10 28644397
#基准16 0xAABBCCDD
u32=0xAABBCCDD
打印'u32=',u32'(0x%x)'%u32
#大端数0xAA 0xBB 0xCC 0xDD
u32be=struct.pack('>I',u32)
bx=[解包结构中的字节对字节('4B',u32be)]
打印“大端压缩”['0x%02x'%x代表bx中的x]
断言bx==[0xaa、0xbb、0xcc、0xdd]
#小端点0xDD 0xCC 0xBB 0xAA
u32le=结构包('Q',u64)
bx=[解包结构中的字节对字节('8B',u64be)]
打印“大端压缩”['0x%02x'%x代表bx中的x]
断言bx==[0xaa、0xbb、0xcc、0xdd、0xee、0xff、0x00、0x11]
#小端点0x11 0x00 0xFF 0xEE 0xDD 0xCC 0xBB 0xAA

u64le=struct.pack(“看起来您的下一步将是使用
struct
。类似以下内容:

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

struct.unpack(“看起来您的数据实际上没有被压缩。请使用以浮点形式在循环中读取数据,或者使用作为一个大结构读取数据

导入base64
导入结构
编码='Dn3LQ3np…9BnKRA='
#解码字符串
数据=base64。标准解码(编码)
#确保有足够的数据用于32位浮点运算
断言长度(数据)%4==0
#确定有多少个浮动
count=len(数据)//4
#将数据解压为浮点数

结果=struct.unpack(“您尝试了什么?您在哪里遇到了问题?我们将帮助您解决任何具体问题,但我们不会为您编写代码。如果您真的很感激,请编辑您的问题并添加所需的信息。谢谢。我现在将删除问题,将尝试,尝试,尝试,如果没有意义,我们将提出。”我所做的一切!这就是我所要求的-解释你所尝试的,发布代码,我们将看到:)考虑使用
“啊,不知道我们可以这样使用它。似乎也可以。谢谢你的提示。这只是一个例子,数据可以压缩或解压缩!