C#中如何拆分接收消息 将不同部分赋值给对应变量
HTTP 0.9格式消息拆分方案
核心需求
需要从固定格式的协议消息中提取两个字段:
- 名称字段:请求行中
PUT /后的路径部分 - 位置字段:消息体的全部内容
标准消息样例:
PUT /Person\r\n\r\nis in this building\r\n
样例提取结果:name = "Person",location = "is in this building"
原有代码问题
之前的实现存在三个硬伤:
- 固定用
:作为分割符,只要位置内容本身包含冒号就会拆分错位 - 靠固定长度偏移裁剪字符串,消息长度、字段长度变化就会提取错误
- 按反斜杠
\分割字符串会把转义换行\r\n拆成独立的字符片段,无法正确识别协议分隔符
实现思路
不要针对内容字符做分割,直接匹配HTTP 0.9协议的固定结构分隔符即可:
- 协议固定开头为
PUT /,跳过这部分后,到第一个\r\n换行符之间的内容就是名称字段 - 协议规定请求头和请求体用连续两个换行
\r\n\r\n分隔,从这个分隔符之后到消息末尾的\r\n之间的所有内容都是位置字段,完全不需要关心内容里包含什么特殊字符
可直接复用的代码(C#)
// 传入参数:接收到的原始消息字符串rawLine string rawLine = "PUT /Person\r\n\r\nis in this building\r\n"; // 提取名称字段 const string reqPrefix = "PUT /"; int nameStart = reqPrefix.Length; int nameEnd = rawLine.IndexOf("\r\n", nameStart); string name = rawLine.Substring(nameStart, nameEnd - nameStart); // 提取位置字段 const string bodySplitFlag = "\r\n\r\n"; int locStart = rawLine.IndexOf(bodySplitFlag) + bodySplitFlag.Length; int locEnd = rawLine.LastIndexOf("\r\n"); string location = rawLine.Substring(locStart, locEnd - locStart);
方案优势
- 不受内容特殊字符影响:即使位置信息里包含
:、\、换行等任意字符,都不会出现拆分错误 - 无硬编码偏移:不管名称、位置字段的长度是多少,只要符合协议格式就能正确提取
- 不需要额外处理转义字符:直接匹配字符串形式的换行分隔符,不会出现把r、n拆成独立字符的问题
内容的提问来源于stack exchange,提问作者randomUser1212421
相关产品推荐
相关产品推荐

