【问题标题】:Best practice for formatting a string which needs to be send via TCP/IP格式化需要通过 TCP/IP 发送的字符串的最佳实践
【发布时间】:2020-02-20 21:14:55
【问题描述】:

我有几个参数,需要通过 TCP/IP 发送到客户端应用程序。

例如:

//inside C++ program
int Temp = 10;
int maxTemp = 100; 
float Pressure = 2.3;

问题:格式化字符串的最佳做法是什么?我需要确保客户端接收到整个字符串,并且客户端应该更容易解码字符串。

基本上,我想知道,我要发送的字符串应该是什么格式

PS:客户端应用程序是 C#,发件人的应用程序是 Qt (C++)。

【问题讨论】:

  • 你是说XML还是JSON?
  • 一种常见的方法是使用例如格式化有效负载json(或 protobuf,或 xml,或其他一些现成的序列化机制)。然后将每个数据包格式化为[start character]/length/payload/[checksum]/[end character],其中方括号中的组件可能使用也可能不使用。
  • 我的第一条规则是避免使用字符串进行存储、传输或检索。它是第二个最差的处理类型。只有原始字节更糟|我的第二条规则是:选择要在所有端点使用的固定文化格式和编码。 XML 会自动为您做到这一点。我认为 JSON 也是如此。处理这个问题是它们存在和使用的一个重要原因。 |您不想遇到编码 (joelonsoftware.com/2003/10/08/…) 或文化不匹配问题
  • @duDE:我将 C++ 程序中的参数值作为变量。
  • @Christopher:您的意思是我需要将参数值格式化为 XML 格式?还是我需要先将参数写入 XML 文件?

标签: c# c++ tcp


【解决方案1】:

这是相当主观的,但如果它总是像描述的​​那样简单,那么:保持简单:

ASCII、空格分隔、不变(与文化无关)格式的整数,完全展开形式(没有 E 等),CR 作为结束标记,所以:

10 100 2

(末尾有 CR)这可以扩展到任意数量的记录,并且几乎可以从任何平台轻松解码。

如果它变得更细微:使用为该作业构建的序列化程序,并分享您正在使用的序列化格式的详细信息。

【讨论】:

  • 但我想将参数名称(例如 T、P、mT)也放入字符串中。
  • @skm 查看如何添加参数名称。
【解决方案2】:

使用paramName paramValue 形式的ASCII、空格分隔、与区域性无关的格式并使用完整形式的整数(无E 表示法)并在末尾使用回车符,例如:T 10 P 100 mT 2 与CR 在结尾。另一方面,您可以简单地用空格分割字符串,并注意偶数索引是参数,赔率索引是参数值。请注意,对于每个偶数参数名称索引 ii+1 是其对应的奇数索引参数值。还要注意最后的 CR。

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 2013-12-01
    • 2019-06-29
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 2018-01-12
    • 2015-12-17
    相关资源
    最近更新 更多