3

我正在为交钥匙网络通信编写 ac# 库。我正在寻找一个明确的字节,我可以在我的库中使用它来指示数据块的结束。目标是能够发送任何格式的文件或字符串。Null 字符是否会这样做,这样它就不会破坏 TCP 连接,并且任何文件或字符串都不应该在它的数据中包含它。

提前致谢。

编辑:顺便说一句,客户端和服务器都是我的库的一部分,因此它不需要遵守任何其他标准。

回答后:我将创建一个 X 字节数组,然后使用最后一个字节来指示 EOF 是否以及位于 (X-1) 字节块中的位置。

4

3 回答 3

10

你问不可能

“任何文件或字符串”可以包括任何字节序列。

这使得完全不可能找到 EOF 字节。即使是字节序列也不能保证在所有情况下都有效。

解决方案:预先知道文件大小

将要跟随的数据长度作为通信标头的一部分发送。

解决方案:文件大小未知/流式传输

定义一个数据结构,该结构包含一个标记,是否有更多数据与文件内容分开。

于 2012-08-07T04:00:23.313 回答
4

根据定义,这似乎是不可能的。总是表示数据结束的单个字节?但是您希望能够发送任何文件,其中可能包括可以包含任何字节的二进制文件。很明显,您需要对文件内容进行限制才能为 EOF 保留一个字节。

就像评论中提到的 Blorgbeard 一样,先看看发送数据的长度。这可以是商定的字节数,表示数据的有效负载将多长时间。您的程序读取此元数据以了解在数据包结束之前应该读取多少字节。

于 2012-08-07T03:59:46.487 回答
1

另一种解决方案是“转义”数据主体中的任何终止字符,例如。如果使用 NUL 作为终止符,请将任何 NUL 替换为 [ESC][SOH] 并将任何 [ESC] 替换为 [ESC][ESC]。

这适用于任何长度的任何流数据,但它确实意味着在两端迭代数据。

于 2012-08-12T23:36:29.540 回答