假设我有一个小于100字节的字符串(如果重要的话是unicode)变量。我想创建另一个变量,其大小恰好为100字节,包含此字符串,并用零或其他填充。我将如何在Python 3中完成它?
答案 0 :(得分:6)
为了组装数据包通过网络或组装字节完美的二进制文件,我建议使用struct
模块。
对于字符串,您可能不需要struct
,但只要您开始打包二进制值,struct
就会让您的生活更轻松。
根据您的需求,使用现成的网络序列化库(例如Protocol Buffers)可能会更好;或者你甚至可以只使用JSON作为有线格式。
答案 1 :(得分:5)
这样的事情应该有效:
st = "具有"
by = bytes(st, "utf-8")
by += b"0" * (100 - len(by))
print(by)
# b'\xe5\x85\xb7\xe6\x9c\x890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
强制性附录,因为您的原始帖子似乎将字符串与其编码字节表示的长度混为一起:Python unicode explanation
答案 2 :(得分:3)
您可以使用bytes.zfill
方法添加所需的零数:
In [19]: result = bytes('おくりびと', 'utf-8').zfill(100)
In [20]: result
Out[20]: b'0000000000000000000000000000000000000000000000000000000000000000000000000000000000000\xe3\x81\x8a\xe3\x81\x8f\xe3\x82\x8a\xe3\x81\xb3\xe3\x81\xa8'
In [21]: len(result)
Out[21]: 100
答案 3 :(得分:2)
要使用空字节填充,您可以像在stdlib base64模块中那样进行填充。
some_data = b'foosdsfkl\x05'
null_padded = some_data + bytes(100 - len(some_data))
答案 4 :(得分:1)
这是一种迂回的做法:
>>> import sys
>>> a = "a"
>>> sys.getsizeof(a)
22
>>> a = "aa"
>>> sys.getsizeof(a)
23
>>> a = "aaa"
>>> sys.getsizeof(a)
24
所以在此之后,一个100字节的 ASCII 字符串需要长度为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