面试题答案
一键面试关键要点
- 解析分块大小:每一个分块的开头是一个十六进制数,表示该分块的大小。需要将十六进制字符串转换为十进制整数。
- 跳过CRLF:分块大小后面跟着一个CRLF(\r\n),需要跳过这两个字符。
- 读取分块数据:按照分块大小读取相应长度的数据。
- 处理最后一个空分块:最后一个分块大小为0,标识数据结束。
- 处理分块间的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;
}