我正在尝试将这个Python代码转换为C.但是对于我的生活,我无法弄清楚这一行在这里做了什么。该计划的其余部分似乎很简单。
self.payload = "\x02\x00%s%s" % (
pack(">b", length),
"".join(random.choice(string.printable) for i in range(length)))
如果有人能够粗略地了解这是做什么的,那就非常感激了!
答案 0 :(得分:5)
第一行:
length = random.randint(18, 20)
的正确翻译为int length = rand() % 3 + 18
。现在让我们逐个剖析密集的第二行。
"\x02\x00%s%s" % (x, y)
表示用给定的参数替换格式字符串(如sprintf()
)。在这种情况下,它意味着将字节0x02,0x00与两个字符串x
和y
连接起来。
x = pack(">b", length)
使用struct.pack()
。在这种情况下,它意味着将整数值length
转换为表示其值的一个字节。这几乎相当于使用chr()
。
y = "".join(z)
表示获取列表z
中的每个元素(必须是一个字符串),并将它们与它们之间的“”(无)连接起来。 (例如,"@".join(["a","b","c"]) --> "a@b@c"
。)
z = (random.choice(string.printable) for i in range(length))
返回一个生成器对象。您可以将其视为一个列表,其元素按需计算。在这种情况下,它会生成length
个元素,其中每个元素都是从字符串string.printable
中随机选择的一个字符。
总而言之,第二行产生一个字符串,该字符串以0x02 0x00开始,后跟(char)length
,后跟length
个随机字符,每个字符均从字符集string.printable
中统一选择。