今天对http协议包进行解析.协议规定每一行以/r/n作为结束.也就是CRLF(0D0A).
搭一个测试环境,把协议包保存在文件里,再从文件读到内存进行解析.发现内存里就只有'/n',字符'/r'不见了.很奇怪.把程序和文件放在一台linux机器下测试,也是这样,内存里只有/n.但用ultra edit打开文件是可以看见有/r/n的.
上网搜了一下,有人说"/r 就是换行 /n 是回车",换行和回车又有什么区别?引用一段文字说明:
回车换行的来历:
在PC出现以前,文秘们都是使用打字机打印文档资料的。(最著名的品版是Brother)。打字机是铅字打印,其键盘的排列与现在的PC键盘相同。(鉴于人们的使用习惯,打字机键盘-->终端键盘-->PC键盘,其键盘布局几乎没变过)。打字机的键盘上除了“Enter”(升行键)之外,还有一个机械装置-->“回车”,其意为将打印定位装置置为行首。“Enter”的含意为走纸升行,但如果不操作“回车”装置,打印位置将是当前的位置。
在终端或PC上,“Enter”(即/n,0x0A)常代表了回车并且升行。在不同的OS中,文本文件的格式是有区别的,如DOS-->Windows、Unix-->Linux,在DOS-->Windows的文本文件中,使用了/r/n(0x0D 0x0A)来表示回车并且升行。在Unix-->Linux的文本文件中,使用/n(0x0A)来表示回车并且升行。即通常所说的Unix格式或DOS格式。
在基于文本的通信协议定义时,对/r/n的使用有严格的定义,如在HTTP中,标识一行的结束,必须使用/r/n。
按图索骥,查了一下msdn关于fread()函数的说明.有一句话If the given stream is opened in text mode, carriage return–linefeed pairs are replaced with single linefeed characters.也就是我以文本方式打开,函数会将/r/n转换成/n.要想看到/r/n应该以二进制方式打开.
但照网页上的说法,在linux下执行程序文件应该只有/n,但很奇怪我测试的结果还是有/r/n.不知道为什么.
参见:http://www.codeguru.com/forum/showthread.php?s=&threadid=253826