我是使用套接字的新手。我有一个非常基本的客户端,可以发送请求并等待响应。响应是一个流,但是有两个部分。第一部分以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/