python-如何解压缩文本或字符串集



如何单独打开它们的包装??我想从txt中获取字符串的长度(使用的)和字符串本身?有什么帮助吗?

dataType = struct.pack('H', gvrDatatype)
varName = struct.pack('B' + str(len(gvrVarname)) + 's', len(gvrVarname), gvrVarname)
txt = struct.pack('B' + str(len(gvrTxt)) + 's', len(gvrTxt), gvrTxt)

我认为要回答的第一个问题是:为什么首先要这样打包字符串?除非您将其作为数据结构传递给接受上面创建的格式的库,否则不需要这样做:将字符串作为文本存储在文本文件中,而不是作为二进制存储。如果您需要空间/性能,请使用SQL引擎-SQLITE可以正常工作。

同时也尝试一下上面的代码很难阅读Python——它可能是唯一的在Javascript中插入字符串和数字的方法,但在Python中,您应该使用:txt = struct.pack('B%ds' % len(gvrTxt) , len(gvrTxt), gvrTxt)而非

txt = struct.pack('B' + str(len(gvrTxt)) + 's', len(gvrTxt), gvrTxt)

正如您所指出的,如果不首先手动对其进行切片,就无法使用struct.unpack方法对其进行解压缩,因为UNACK要求传递的字节字符串包含的压缩值的大小与传递的格式相等。

您可以通过首先对第一个字段的大小进行切片,然后将其传递给unpack,然后对结构的剩余部分进行unpack来检索大小:

length = struct.unpack("B", text[0:1])[0]
gvrTxt = struct.unpack("%ds" % length, text[1:][0]

当然,如果您只使用字节串,就根本不能使用struct:

gvrTxt = text[1:]

如果您将上述结构连接在一起,请执行以下操作:

data = dataType + varName + txt

你必须单独打开包装,使用varName的长度来知道在哪里挑选txt的启动

datatype = struct.unpack("H", data[0:2])
lenvarname = ord (data[2])
varName = data[3: 3 + lenvarname]
txt = data [ 4+ lenvarname:]

但我坚持认为,这在Python程序中通常是不需要的——只有当您正在为另一个应用程序生成一个非常特定的文件以供使用,或者在本机代码中调用一个具有相当不正确的Python绑定的库时,才需要它。

此外,请注意,这些技术不允许正确处理"文本",因为不能保证任何文本内容每个字符都有一个字节:请阅读http://www.joelonsoftware.com/articles/Unicode.html在进一步编码之前,即使您认为在您的生活中永远找不到unicode字符。因为你会的。你的程序会先命中他们。

#作者:Ishraga Mustafa Awad Allam。日期:19-2022。

from struct import *
class cstruct:
var_i = 0
var_f = 0.0
var_str = ''
obj_array = [cstruct() for i in range(2)]
obj_array[0].var_i = 10
obj_array[0].var_f = 10.00
obj_array[0].var_str = "ten"
obj_array[1].var_i = 100
obj_array[1].var_f = 100.0251234567890
obj_array[1].var_str = "tenThosand"
val = int(input("Enter your integer number: "))
va = float(input("Enter your float number: "))
obj_array[1].var_i = val
obj_array[1].var_f = va
#go ahead and fill rest of array instaces of struct

#打印所有值对于范围(2)中的i:打印("cstruct:obj_array i=%d f=%f s=%s"%(obj_aarray[i].var_i,obj_aArray[i].var _f,obj _array[i].war _str))

s = bytes(obj_array[0].var_str, 'utf-8')    
# Or other appropriate encoding
d2= pack("I%dsif" % (len(s),), len(s), s, obj_array[0].var_i, obj_array[0].var_f)  
pack('if', obj_array[1].var_i, obj_array[1].var_f)
s = bytes(obj_array[1].var_str, 'utf-8')    
# Or other appropriate encoding
d=pack("I%ds" % (len(s),), len(s), s)   
a = pack("<10s", s)
print(a)
z = unpack("<10s", a)
print(z)
data = unpack("I", d[:4])
print(data)
data = unpack("s", d[:1])
print(data)
d3= pack("<if10s", obj_array[1].var_i, obj_array[1].var_f, s)
print(d3)
z3 = unpack("<if10s", d3)
print(z3)
d4= pack("<if10s", obj_array[1].var_i, obj_array[1].var_f, 
obj_array[1].var_str.encode())
print(d4)
z4 = unpack("<if10s", d4)
print(z4)
f1 = open("dfile.dat",'wb')
f1.write((d3))
f1.close()
f2 = open("dfile.dat",'rb')
dat1 = f2.read(4)
u1 = unpack('i', dat1)[0]
dat2 = f2.read(4)
u2 = unpack('f', dat2)[0]
dat3 = f2.read(10)
u3 = unpack('10s', dat3)[0]
dat = dat1 + dat2 + dat3
print(dat1)
d1, d2, d3 = unpack("if10s", dat)
u3 = u3.decode()
d3 = d3.decode()
print(u1, u2, u3)
print(d1, d2, d3)
f2.close()

最新更新