关闭

关于/r和/n

标签: 测试linuxstream终端unixdos
6525人阅读 评论(1) 收藏 举报
分类:

    今天对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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:42971次
    • 积分:778
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:8篇
    • 译文:0篇
    • 评论:16条
    文章分类
    最新评论
  • 产品发布

    shalvey: 没恶化,营养不良

  • 临时对象

    shalvey: 我在vs2005下试了一下, 不加const输出也正常。看来不加也是可以的。

  • awk用法

    shalvey: awk使用反斜杆"/"做为转义字符,所以 /^/$/匹配以美元符号"$...

  • 几首歌

    shalvey: 百强: 《等》,《相思河畔》

  • freerice

    TD: 也想去见识下是什么好玩意,无奈校园网登陆不了啊

  • awk用法

    shalvey: if ($1 ~ /^IP/ && tag == 1) {gsub(//,"",$2...

  • 编码转换

    TD: 不仅品位见长,技术也越发的厉害了

  • 蝴蝶泉边

    TD: 小伙子品位见长啊

  • 临时对象

    td_dyy: 有点不明白,解决方法2里面,不加const 会怎么样? 难道不加const,临时变量的生存期就不会延...

  • 设计

    td_dyy: 交流的氛围不是很好哦 是不是因为大家都是正式员工都比较现实的原因?