You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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协议的固定结构分隔符即可:

  1. 协议固定开头为PUT /,跳过这部分后,到第一个\r\n换行符之间的内容就是名称字段
  2. 协议规定请求头和请求体用连续两个换行\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.11 16:16:22