我正在为交钥匙网络通信编写一个c#库。我正在寻找一个非模糊的字节,我可以在我的库中使用它来指示数据块的结束。目标是能够发送任何文件或字符串,无论格式如何。 Null字符是否会这样做,以至于它不会使用TCP连接,并且文件或字符串中不应该包含它的数据。
提前致谢。
编辑:BTW客户端和服务器都是我的库的一部分,所以它不需要遵守任何其他标准。
回答后: 我将创建一个X字节数组,然后使用最后一个字节来指示EOF是否位于(X-1)字节块中。
答案 0 :(得分:10)
你问不可能的
“任何文件或字符串”可以包含任何字节序列。
这使得完全无法找到EOF字节。即使字节序列也不能保证在所有情况下都能正常工作。
解决方案:事先知道文件大小
发送要跟随的数据长度作为通信标头的一部分。
解决方案:文件大小未知/流式传输
定义一个包含标记的数据结构,是否有更多数据与文件内容分开。
答案 1 :(得分:4)
根据定义,这似乎是不可能的。一个始终表示数据结束的字节?但是您希望能够发送任何文件,其中可能包含可包含任何字节的二进制文件。很明显,您需要对文件内容进行限制才能为EOF保留一个字节。
与评论中提到的Blorgbeard一样,请先查看发送数据的长度。这可以是商定的字节数,表示数据的有效载荷将持续多长时间。您的程序会读取此元数据,以了解在数据包结束之前应该读取的字节数。
答案 2 :(得分:1)
另一种解决方案是“逃避”数据正文中的任何终止字符,例如。如果使用NUL作为终结者,用[ESC] [SOH]替换任何NUL,用[ESC] [ESC]替换任何[ESC]。
这适用于任何长度的任何流数据,但它确实意味着在两端迭代数据。