您的位置:首页 > 运维架构 > Linux

Linux和Windows文件编码格式区别

2015-12-29 15:00 453 查看
1.业务场景

需要从linux服务器向windows PC机发送/抓取文本。Linux通过访问安装在windows PC上的ftp server的共享目录实现文件的读写。

2.发现问题

因需要保证文件的完整性和一致性,我们对文本添加MD5校验码,并将MD5码一并发送到目标机器。结果发现linux服务器上对文本生成的MD5码与windows pc上对文本生成的MD5码不一致。

3.寻找答案

    DOS终结符-CR/LF

    UNIX终结符-LF
    MAC终结符-CR

 
unix文本文件和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工具~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows linux md5