如何在Python中创建固定大小的字节变量
假设我有一个字符串(如果需要的话是Unicode格式),它的大小不到100个字节。我想创建一个新的变量,大小正好是100个字节,这个变量里包含这个字符串,并且用零或者其他东西填充到100个字节。请问我该如何在Python 3中实现呢?
4 个回答
1
这里有一种绕弯子的做法:
>>> import sys
>>> a = "a"
>>> sys.getsizeof(a)
22
>>> a = "aa"
>>> sys.getsizeof(a)
23
>>> a = "aaa"
>>> sys.getsizeof(a)
24
所以根据这个,一个ASCII字符串如果有100个字节的话,它的长度需要是79个字符。
>>> a = "".join(["a" for i in range(79)])
>>> len(a)
79
>>> sys.getsizeof(a)
100
上面这种方法是一个相对简单的方式,可以用来“校准”字符串,以便弄清楚它们的长度。你可以写个脚本来自动调整字符串的长度,以适应其他编码所需的内存大小。
def padder(strng):
TARGETSIZE = 100
padChar = "0"
curSize = sys.getsizeof(strng)
if curSize <= TARGETSIZE:
for i in range(TARGETSIZE - curSize):
strng = padChar + strng
return strng
else:
return strng # Not sure if you need to handle strings that start longer than your target, but you can do that here
3
如果你想用空字节来填充,可以参考标准库中base64模块的做法。
some_data = b'foosdsfkl\x05'
null_padded = some_data + bytes(100 - len(some_data))
7
像这样应该可以工作:
st = "具有"
by = bytes(st, "utf-8")
by += b"0" * (100 - len(by))
print(by)
# b'\xe5\x85\xb7\xe6\x9c\x890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
补充说明一下,因为你最初的帖子似乎把字符串和它们编码后占用的字节长度搞混了:Python的Unicode解释
7
如果你想把数据打包发送到网络上,或者想要制作完全一致的二进制文件,我建议你使用 struct
模块。
如果只是处理字符串,可能不需要用到 struct
,但一旦你开始处理二进制值,struct
会让你的工作轻松很多。
根据你的需求,你也可以选择现成的网络序列化库,比如 Protocol Buffers;或者你甚至可以直接使用 JSON 来作为数据传输格式。