【问题标题】:How can I construct a Python string that is 16 bytes long?如何构造一个 16 字节长的 Python 字符串?
【发布时间】:2026-01-08 11:40:01
【问题描述】:

当我创建一个包含一个字符的 Python 字符串时,即

txt = "h"

我检查了它的大小,我得到了

import sys
sys.getsizeof(txt)
34

如果一个字符是 34 字节,我如何制作一个 16 字节的字符串?

附:我在玩PyCrypto AES, in OFB Mode,它需要输入 16 个字节

【问题讨论】:

  • 创建一个字节数组,而不是字符串
  • sizeof 包括根本不重要的对象标头。现在,如果您使用的是 python3,那么获得准确的字节数仍然很重要(编码会根据字符串的内容发生变化),但话又说回来,如果您没有使用字节数组进行加密,那么您做错了。
  • 一个16个字符长的字符串据说是16个字节(在python2中)...python3改变了一些东西

标签: python string byte pycrypto


【解决方案1】:

sys.getsizeof(obj) 返回对象的大小,包括内部值。这包含的不仅仅是字符串的字符或字节。

如果您想知道bytes 对象或str 的长度,可以调用len(byteString)len(string)

我假设您想使用生成随机 IV 或密钥。这可以通过这种方式完成:

from Crypto import Random
iv = Random.new().read(16)

如果系统有足够的熵,这将调用 CSPRNG。您也可以使用AES.block_size 代替16

【讨论】:

  • 请参阅here,了解 Python 2 和 Python 3 之间 bytes 和 str 之间的差异。
【解决方案2】:

getsizeof 不会返回字符串的实际大小,但会产生额外的垃圾收集器开销。 如下所示,test 以空字符串开头,但由于上述原因,为其分配的内存不为零。

>>> test = ""
>>> sys.getsizeof(test)
37
>>> test = "" + "h"
>>> sys.getsizeof(test)
38
>>> test = "" + "h" + "h"
>>> sys.getsizeof(test)
39
>>>

要创建一个 16 字节的字符串,一种方法是:

>>> test = " " * 16
>>> sys.getsizeof(test)
53

53 - 37 = 16 个字节

【讨论】: