1.业务场景
需要从linux服务器向windows PC机发送/抓取文本。Linux通过访问安装在windows PC上的ftp server的共享目录实现文件的读写。
2.发现问题
因需要保证文件的完整性和一致性,我们对文本添加MD5校验码,并将MD5码一并发送到目标机器。结果发现linux服务器上对文本生成的MD5码与windows pc上对文本生成的MD5码不一致。
3.寻找答案
DOS终结符-CR/LF
UNIX终结符-LF MAC终结符-CRunix文本文件和windows/dos文本文件的格式区别主要是两点: 换行符: unix(/n) windows/dos(/r/n) Ctrl: ^J ^M^J Dec: 10 13+10 Hex: 0A 0D+0A Code: LF CR+LF 文件结束符: unix windows/dos Ctrl: ^D ^Z Dec: 04 26 Hex: 04 1A ftp工具可以选择以文本或者二进制格式传输, ASCII模式和Binary模式的区别是回车换行的处理,Binary模式不对数据进行任何处理,ASCII模式将回车换行转换为本机的回车字符,比如:UNIX下是\n,Windows下是\r\n,Mac下是\r。
So, 真相大白了。linux服务器上的文件是unix文本文件,以\n作为换行符,此刻生成MD5吗是对unix文本文件生成的校验码。unix文本文件在通过FTP 以 ASCII模式传输到windows PC后,转换成了以\r\n为换行符的dos(或称作pc)编码文本文件。这时在对这个文件生成MD5校验码必定和之前在linux上生成的MD5校验码不一致~~~罪魁祸首就是不同操作系统对终结符有不同的编码方式。
4.解决方式
Linux提供了两种文本格式相互转化的命令:dos2unix和unix2dos,dos2unix把"\r\n"转化成"\n",unixtodos把"\n"转化成"\r\n"。Java程序中,使用 Runtime.getRuntime().exec("unix2dos "+ fileName);来实现对文本格式互转命令的调用。多说一句,执行指令前要先看看linux上是否有安装unix2dos/dos2unix工具~~~更多推荐
Linux和Windows文件编码格式区别
发布评论