此代码中[:http_payload.index(“ \ r \ n \ r \ n”)+ 2]中的“ +2”和“:”是什么意思?

时间:2019-04-01 21:55:13

标签: python

为什么在第一种情况下其“ +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:]

3 个答案:

答案 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

的更多信息