文本和二进制

摘自Serv-U网站:
When using ASCII mode, files are actually changed, depending on the server. ASCII mode is used to translate ASCII text files between the server and client. For example when uploading to a UNIX server [CR][LF] (carriage return line feed) is converted to just [LF]. And when downloading [LF] is converted to [CR][LF].

This is used to make sure text files are correct for any environment.

When doing this files are actually changed, and the size and content of files are changed. If you're uploading images or some other binary files it is quite likely that the files will be uploaded or downloaded incorrectly.
文本传输与二进制传输

首先我们来说说文本传输与二进制传输的相同之处:

相同点:

1,无论是文本传输还是二进制传输,其实均是将被传输对象转化为二进制字节进行传输的,很多人认为文本传输,顾名思义,就是网络直接传输文本,,,,这是不对的。。。。。

2,无论是文本传输还是二进制传输,均是需要有一定的编码方式的。如果一个被传输对象是utf8格式的字符串,那么无论是文本传输还是二进制传输给客户端,客户端解析也必须使用utf8进行decode来获得该字符串。



不同点:

ASCII 方式和BINARY方式的区别是回车换行的处理,binary方式不对数据执行任何处理,ASCII 方式将回车换行转换为本机的回车字符,比如Unix下 是\n,Windows下是\r\n,Mac下是\r

  ASCII 方式下会转换文件,不一样的系统有不一样的行完毕符,unix系统下行完毕符是一个字节,即十六进制的0A,而ms的系统是两个字节,即十六进制的0D0A所以当你用ascii方式从unix的ftp server下载文件时(不论是二进制或许文本文件),每检测到一个字节是0A,就会自动插入一个0D,所以假设你的文件是二进制文件 比如可执行文件、紧缩包什么的,就肯定无法用了。

为什么操作系统对于换行符的定义不同呢,因为他们采用了不同的编码解码规范(字符集),依照不同的码表对二进制数据进行解析的原因。

  假设你的文件就是unix下的文本文件,你用 ascii方式是正确的,要是误用了binary方式,你在windows上看这个文件是没有换行的,内部是一个个的黑方块。普通来说,咱们最好都用binary方式,这样可以保证不出错。假设有文本格式转换的疑问,即unix格式的文本和dos格式的文本 之间的转换,有许多工具可以做的,不要在ftp传输的时辰冒险,尤其是你假设对这些东西不是十分清楚的话。

  可以运用 MIME,把一切的字符,转换成0~128之间的字符,然后传送,在接受方再将接纳到的字符MIME反向转换。通常咱们发送邮件,就是运用这样的字符转换 方式

   ------------------------------------------------------------------

   补充:文本方式和二进制方式传文本文件的详细区别可以在linux下运用cat -A 文件名 看到两者的区别,当然前提是在windows下上传的文本为dos格式,这个可以用高级的文本编辑器看如ultraedit等。两者的区别是二进制 方式上传的文本比文本方式多一个^M符号,这个就是windows下dos格式的/r回车符号,也就是上面提到的十六进制的0D,在vi下运用全局替 换:%s/^M//g[^M运用Ctrl+V+M而不是直接输入^M]去掉一切的回车符或许运用dos2unix file执行转换,这样保管后或许生成后的文件就和文本方式上传的文件一样了。。。



何时使用文本传输?

当需要被传输的数据需要在多个操作系统打开,且不同的操作系统的默认编码解码解析字符集不同时。比如传递的是一个文本文件时,由于会出现换行等情况,而不同的操作系统默认码表对应换行符的二进制编码是不同的,windows采用unicode,unix采用ansci。



何时使用二进制传输?

可执行文件,图片文件等必须要对换行符进行重新解析的数据应该使用二进制传输。


在Unix和Windows系统之间用ftp传输数据时:

一、传输的是文本数据,则必须用文本格式,否则从Windows到Unix传输时,Windows下的每一个换行为"回车+换行"(0x0D0A),Unix在接收的时候,都将自动滤去其中的"回车",也就是转换为Unix下的单单一个"换行"(0x0A)符。反之,当Windows接收Unix操作系统传输过来的数据时,将自动在每一个"换行"(0x0A)符前添加一个"回车"(0x0D)符。此时如果采用二进制格式传输,操作系统之间将不做相应转换,而Windows和Unix对换行符的解析操作不同,Unix会把Windows传过来的0x0D当做单独的字符解析,这样将出现莫名其妙的乱码,同样,Windows也会把Unix传过来的0x0A当做一个字符而不是解析为换行符(Windows)下的换行符为0x0D0A。

二、如果传输的是二进制数据,则必须用二进制格式。否则如果采用文本格式,如上所述,Windows会在接收到的文件里0x0A前自动添加0x0D,而Unix将自动把所有0x0A前的0x0D删掉,呵呵,想一想,你好不容易编译过的可执行文件传过去之后会变成什么样子?基本不可能是你在本地机器上所看到的样子。

上述只适用于Windows和Unix系统之间传输,同种类型操作系统之间传输不存在转换问题

你可能感兴趣的:(二进制)