为什么在第一种情况下其“ +2”却在其“ +4:”之下?
def get_http_headers(http_payload):
try:
# split the headers off if it is HTTP traffic
headers_raw = http_payload[:http_payload.index("\r\n\r\n")+2]
# break out the headers
headers = dict(re.findall(r"(?P<name>.*?): (?P<value>.*?)\r\n", headers_raw))
except:
return None
return headers
def extract_image(headers, http_payload):
image = None
image_type = None
try:
if "image" in headers["Content-Type"]:
# grab the image type and image body
image_type = headers["Content-Type"].split("/")[1]
image = http_payload[http_payload.index("\r\n\r\n")+4:]
答案 0 :(得分:0)
对http_payload.index("\r\n\r\n")
的调用返回字符串http_payload
中第一个空白行的起始索引,而http_payload[:index]
将字符串http_payload
切成给定的索引,因此http_payload[:http_payload.index("\r\n\r\n")+2]
返回http_payload
,该切片被切成第一行空白,但是包含了两个\r\n
中的第一个,即尾随换行符,因为索引加两个包括了字符之后的两个字符\r\n\r\n
的起始索引。
答案 1 :(得分:0)
“ http_payload.index("\r\n\r\n")
”部分的意思是,“在\r\n\r\n
的值中查找字符串http_payload
,并获取第一次显示的位置编号。”或者,如果http_payload
是一个列表,则意味着在列表中找到值\r\n\r\n
的位置。因此+2
只需将这个值加2。实际上,您在这里所做的是,“查找有双倍行距的行,并找到该对中第二行中断的位置。”
因此,完整的http_payload[:http_payload.index("\r\n\r\n")+2]
命令的意思是,“拿起字符串,寻找第一个双倍行距换行符,然后从第二个换行符处截取任何内容。”
答案 2 :(得分:0)
让我们这样看。
首先将索引值保存到变量。索引值可能是整数:
http_payload_index = http_payload.index("\r\n\r\n") #resolves to an integer value
在第一种情况下,尝试将2添加到上述值,并使用字符串切片将所有内容选择到http_payload_index+2
位置:
headers_raw = http_payload[:http_payload_index+2]
例如,如果http_payload_index
等于3,则3 + 2 = 5将给出:
headers_raw = http_payload[:5]
如果http_payload
由类似'This is a header'
的字符串组成,那么headers_raw
的值将为'This '
,并选择索引位置5之前的所有内容。
类似地,在第二种情况下:
headers_raw = http_payload[http_payload_index+4:]
如果http_payload_index
为3,则headers_raw
的计算结果为3 + 4 = 7并且
headers_raw = http_payload[7:]
,如果http_payload
由相同的字符串This is a header
组成,那么headers_raw
的值将为' a header'
,从索引位置7中选择所有内容。 >
您可以了解有关字符串切片here
的更多信息