【问题标题】:C++/Qt String Terminaton in payload有效载荷中的 C++/Qt 字符串终止符
【发布时间】:2014-12-20 02:18:34
【问题描述】:

在通过 IPC、串行、以太网等通信接口发送字符串时,程序员如何处理字符串终止...

仅保留字符串终止并因此仅在有效负载缓冲区中附加多个字符串是否合法?

或者有没有类似规则说不,你不通过通信接口发送字符串终止?

谢谢

【问题讨论】:

  • 当然所有字节都是原始字节。尽管如此,当一个原始字节代表 NULL 时,我可以判断它是我的终止字符。我需要 s/t 来确定一个字符串何时结束,而另一个字符串何时在缓冲区内开始。
  • 如果不是二进制数据,我认为终止 '\0' 没有任何问题。它在那里经常使用。甚至我自己也使用过很多次。所以别担心,一切都很好。 :-)
  • 好的,谢谢。我试试看

标签: c++ qt termination qbytearray qiodevice


【解决方案1】:

通过任何接口的通信,必须按照定义的协议进行。如果存在字符串终止规则,则协议将定义此规则。如果您不通过现有协议进行通信,则需要定义协议(即用户定义的协议)。在这里,您将定义如何以及是否将终止您的字符串。

【讨论】:

    【解决方案2】:

    您不会以您可能想到的形式通过这些协议发送“字符串”。您以文本或二进制形式发送原始字节。用 Qt 术语将它们视为QByteArrayQDataStream

    您会在 Qt 框架中的 QIODevice 类周围找到这些类,它是任何“IO”的基类。然后,QtCore 中的这个基类在 QtSerialPort、QtBluetooth、QtNetwork 等模块中的子类中重新实现。

    一般来说,您的问题似乎更面向协议,即协议设计。如果它是文本数据,您通常会有终止字符,或者您甚至可以有一个长度字段。终止字符也可以是任何取决于数据的字符,所以不仅仅是\0

    比如我们使用的协议,有时是'\n',有时是';'什么不是。这取决于您,但使用专用的终止字符非常有效,并且在外面被广泛使用,真的。

    当然,以二进制方式发送时,只能应用长度字段。

    【讨论】:

    • 协议是我自己实现的。它应支持多字符串发送。要知道一个字符串何时结束而另一个字符串何时开始,我需要像标记一样的 s/t。这可能是 NULL。 QByteArray 是去掉终止字符还是将其转换为原始字节?
    • NULL 不是字符。这是一个 C/C++ 的东西。事实上,它是 0(数字),如果这就是你的意思,甚至不是 '\0'。 QByteArray 顾名思义是一个字节数组,因此它按字面意思解释字节。因此,它确实保留'\0'。但同样,这不是 NULL。事实上,在某些编译器中,NULL 被实现为 C++11 中的新 nullptr,这很奇怪,也没有那么奇怪。
    • 对不起,我的错,我的意思是 NUL。但是如果 QByteArray 保留它并且我通过接口发送给定的原始字节并且接收者知道这是一个字符串,他可以使用 NUL 来确定字符串的长度,对吗?
    • @wanderameise:不确定 NUL 是什么意思,但你可以使用任何字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多