c# - 如何解析内存流中接收到的数据?

标签 c# sockets tcpclient

我是使用套接字的新手。我有一个非常基本的客户端,可以发送请求并等待响应。响应是一个流,但是有两个部分。第一部分以ANS为前缀,并且是以下格式的一组键/值对:KEY:Value,每对在单独的行上。

响应的第二部分以RCT为前缀,这是预格式化的文本,需要直接发送到打印机。

因此,提取响应的两个部分的最佳方法是什么,并且在第一部分中,获取每个Key:Value对。我什至可能都不需要它们,但是我必须仔细查看每一个,以了解这些值是什么,然后决定如何处理它。

我目前正在将响应写到文本框,只是为了了解其作用,但现在我需要对数据进行实际操作。

这是收到的数据样本:

ANS Result: Data Received                                                                
RCPRES:Q[81]
TML:123
OPP:
MRR:000000999999
<several dozen more KEY:Value pairs>
RCTNov 05 2013  04:03 pm      Trans# 123456

           <pre-formatted text>

最佳答案

考虑到一旦缓冲区完全加载到内存中就在使用它,那么最好的方法就是高效的数组操作。据我所知,MemoryStream类仅是内存中字节数组之上的Stream外观(当然,添加了适当的定位处理)。

最好以最小的有效增量遍历流,因此,假设您的示例文本是真实的,并且取决于新行是CR,LF还是CR + LF,它可能是一个或两个字节。进行迭代直到找到期望的RCT前缀(假设在流中的其他位置都找不到该序列)应该可以让您假设您仍在处理KV对并做出相应的响应。

到达RCT前缀后,您似乎需要切换到特定于您的实现的固定宽度处理方法。

就此系统的高级设计而言,我可能会建议一个捕获/状态对象,该对象能够表示消息中每个不同的可能的KV对(假设固定值仍具有关联的隐式键)。您需要至少2个不同的解析器来根据所需格式处理请求;一个用于KEY:VALUE格式的显式KV对,另一个用于强格式部分的隐式对。有了这些功能后,就可以迭代流字节,然后根据消息的“阶段”将消息的各部分委派给每个解析器。

关于c# - 如何解析内存流中接收到的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19803414/

相关文章:

c# - 在 JavaScript 中验证密码;正则表达式

c# - 每个线程更多 TCPClient 或更多线程

c# - 将文本转换为视频(mp4 或 mov 或 flv)

c# - 关于使用 Botframework v4 更改为新 LUIS key 的问题

c - 通过套接字发送哈希表的内容

c - 如何在没有 while 循环的情况下使用 nanomsg 调查架构?

java - 客户端从服务器读取太多字节?

c# - 使用特定方法套接字服务器调用

java - 多次运行 Runnable Thead (Android)

c# - 如何使用 C# 下载 Google SpreadSheets?