6

我正在构建一个应用程序,它是一个实现 tftp 协议的服务器。我很难理解 tftp 中 ASCII 格式和二进制格式(netascii 和 octect)之间的区别,以及我应该如何以不同的方式读取文件作为协议状态。

我知道一个 ASCII 字符可以用一个字节来表示。所以我不明白以 ascii 模式(每个字符 1 个字节)和二进制模式(1 个原始字节)读取有什么区别。

我可以使用标志 ios::binary 读取二进制模式(tftp 中的八位字节)的文件,而没有它的 ascii(tftp 中的 netascii),但我真的不明白以这两种方式读取文件有什么区别(我总是想出一个字节数组)。

如果有人可以帮助我理解,我将不胜感激

tftp协议规范:http ://www.rfc-editor.org/rfc/rfc1350.txt

我不明白的部分是这个:

当前支持三种传输模式:netascii(这是“美国信息交换标准代码”
[1] 中定义的 ascii,并在“Telnet 协议
规范”[3] 中指定了修改。)请注意,它是 8 位 ascii。本文档中将使用术语
“netascii”来表示此
特定版本的 ascii。);八位字节(这取代了本文档先前版本的“二进制”模式。)原始 8 位字节;邮件,
netascii 字符发送给用户而不是文件。(邮件
模式已过时,不应实施或使用。)其他
模式可以由成对的协作主机定义。

4

1 回答 1

9

有两段可以帮助阐明 netascii 在 RFC-1350/TFTP 中的用途:

netascii(这是“美国信息交换标准代码”[1] 中定义的 ascii,并在“Telnet 协议规范”[3] 中指定了修改。)

“Telnet 协议规范”是 RFC-764,它描述了用于“网络虚拟终端”的各种 ASCII 码的解释。因此,netascii 将遵循这些解释(包括行必须以 CR/LF 序列终止)。

和:

接收 netascii 模式数据的主机必须将数据转换为自己的格式。

因此,例如,使用 EBCDIC 作为其本机编码的主机可能会期望将 netascii 转换为该编码,但会单独保留“八位字节”数据。

如果您在使用 LF 作为行尾的 Unix(或其他)系统上实现 TFTP 服务器,则需要为 netascii 传输添加 CR(以及将文件中的实际 CR 字符转换为 CR/NUL序列。

于 2011-08-18T14:52:59.403 回答