MST

星途 面试题库

面试题:C语言处理HTTP协议中的分块传输编码

在HTTP协议中,分块传输编码用于在HTTP消息体大小未知的情况下发送数据。请用C语言实现一个函数,能够解析并处理接收到的采用分块传输编码的HTTP响应数据。描述在处理过程中需要注意的关键要点,并给出核心代码实现。
11.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

关键要点

  1. 解析分块大小:每一个分块的开头是一个十六进制数,表示该分块的大小。需要将十六进制字符串转换为十进制整数。
  2. 跳过CRLF:分块大小后面跟着一个CRLF(\r\n),需要跳过这两个字符。
  3. 读取分块数据:按照分块大小读取相应长度的数据。
  4. 处理最后一个空分块:最后一个分块大小为0,标识数据结束。
  5. 处理分块间的CRLF:每个分块数据后也跟着一个CRLF,需要正确处理。

核心代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 将十六进制字符串转换为十进制整数
int hex_to_dec(const char *hex) {
    int dec = 0;
    sscanf(hex, "%x", &dec);
    return dec;
}

// 处理分块传输编码数据
void handle_chunked_data(const char *data, size_t len) {
    const char *ptr = data;
    while (ptr < data + len) {
        // 解析分块大小
        const char *chunk_size_str = ptr;
        while (*ptr != '\r') {
            ptr++;
        }
        int chunk_size = hex_to_dec(chunk_size_str);
        ptr += 2; // 跳过CRLF

        // 读取分块数据
        if (chunk_size > 0) {
            printf("Chunk data: ");
            for (int i = 0; i < chunk_size; i++) {
                printf("%c", *ptr);
                ptr++;
            }
            printf("\n");
        } else {
            printf("End of chunked data\n");
            break;
        }

        ptr += 2; // 跳过CRLF
    }
}

你可以这样调用这个函数:

int main() {
    const char *http_response = "4\r\nabcd\r\n2\r\nef\r\n0\r\n\r\n";
    handle_chunked_data(http_response, strlen(http_response));
    return 0;
}