- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何单独解压它们?我想从 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 方法对其进行解压缩,因为 UNPACK 要求传递的字节字符串包含的打包值的大小与传递的格式相等。
您可以通过首先切片第一个字段的大小来检索大小,并将其传递给解包,然后解包结构的其余部分:
length = struct.unpack("B", text[0:1])[0]
gvrTxt = struct.unpack("%ds" % length, text[1:][0]
但是当然你根本不能使用结构,如果你只使用字节串:
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 程序中通常不需要 - 如果您正在生成一个非常特定的文件供另一个应用程序使用,或者在 native 代码中调用一个 Python 绑定(bind)不正确的库,您才需要这个.
另外,请注意这些技术不允许正确处理“文本”,因为不保证任何文本内容每个字符一个字节:请阅读 http://www.joelonsoftware.com/articles/Unicode.html在进一步编码之前,即使你认为你永远不会在你的生活中找到一个 unicode 字符。因为你会的。你的程序会首先攻击他们。
关于python-如何解压文本或字符串集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21732449/
我是一名优秀的程序员,十分优秀!