“用文本视图处理二进制文件的效果很糟” 为什么?

wendy_welcom 2007-12-05 01:58:07
看到一段话:
MS-DOS区分文本文件和二进制文件,但C提供的是文本和二进制视图。通常,对于文本文件使用文本视图,对于二进制文件使用二进制视图。但是,您也可以使用任何一种视图处理任一种文件,尽管用文本视图处理二进制文件的效果很糟

请问:“用文本视图处理二进制文件的效果很糟” 为什么?

劳请前辈不吝赐教,谢谢。
...全文
174 14 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zzyjsjcom 2007-12-05
up
  • 打赏
  • 举报
回复
r_swordsman 2007-12-05
to wendy_welcom
既然你说0x0a 永远是换行符, 那么 用文本视图处理二进制文件的效果很糟 究竟是怎么回事呢?

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

0x0a 是在 ASCII 字符集中,不管哪个代码页,gb2312还是big5都包含(兼容)这个字符集。
ascii 定义的是 0x00 到 0x7f 的,大于 0x7f 的都要特殊处理,
所以就“效果很糟”,因为性能损耗,还要考虑这些那些的转换
  • 打赏
  • 举报
回复
wendy_welcom 2007-12-05
感谢两位前辈的悉心指导,因为帖子5日之后才能追加分数, 为了表达谢意所以帖子暂且不结,等五日后多追加些分数,再结帖。
再次谢谢 r_swordsman 和 很菜的小李 :)
  • 打赏
  • 举报
回复
wendy_welcom 2007-12-05
文本视图处理二进制文件效果不好, 那 二进制视图 处理 文本文件 也会遇到类似的麻烦么?
  • 打赏
  • 举报
回复
r_swordsman 2007-12-05
说的“到底是什么字符,和使用代码页有关” 不太明白。还望指教谢谢
------------------------------

比如字节 0xba 和 0xc3 在我们常用的 gb2312 字符集中是表示字符“好”,而在 big5 字符集中就是 “疑”

所以,同样的字节序列,所表示的字符是和使用代码页有关的。

这也是为什么有些程序会出现乱码的问题。
  • 打赏
  • 举报
回复
wendy_welcom 2007-12-05
r_swordsman 既然你说0x0a 永远是换行符, 那么 用文本视图处理二进制文件的效果很糟 究竟是怎么回事呢?
  • 打赏
  • 举报
回复
r_swordsman 2007-12-05

to skywarship

不同的系统对于文本文件中的换行符有不同的处理方法,GNU/Linux和UNIX系的换行符是"\n",windows系的是"\r\n", MAC OS 是"\r"。

-------------------------
不能这么说,对于任何操作系统,只要你支持国际标准那么对于同一个字节,其解释都是一样的。
即对于 0x0d 永远都是 回车符,对于 0x0a 永远都是 换行符。

你说的情况其实是:当进行文本输入时,如果用户按“回车”,那么对于GNU/Linux和UNIX系是插入“\n”,对于 windows 是 插入"\r\n",对于MAC OS则插入"\r"。 处理文本输出时, 在GNU/Linux和UNIX下如果遇到 \n 则换行显示,忽略 \r, MAC OS 则相反,遇到 \r 换行,忽略 \n
window 需要同时 \r\n,否则作为单个字符显示,就就是为什么使用记事本查看 unix 下的源代码会出现黑色方块的原因,但其他高级的编辑器不会出现黑色方块,因为他们都处理了单个的 \r 或 \n 字符。

在windows下你建一个文本文件,然后只按一下回车,保存之后你看文件的大小,应该是 2 字节,即为 \r 和 \n。
  • 打赏
  • 举报
回复
wendy_welcom 2007-12-05
skywarship 的意思我懂了, 但r_swordsman 说的“到底是什么字符,和使用代码页有关” 不太明白。还望指教谢谢
  • 打赏
  • 举报
回复
skywarship 2007-12-05
总之是经典话题之一,呵呵
  • 打赏
  • 举报
回复
r_swordsman 2007-12-05
对于2进制文件,如果使用二进制视图,那么无需任何转换,全部是字节,整个文件表现为一个字节数组
如果使用文本视图,那就表现为一个字符串。字符串由什么构成呢?都知道是字符吧?
把二进制字节表示为相应的字符是要通过一次转换来完成的,例如二进制 011010101 到底是什么字符,和使用代码页有关,
了解多字节字符集(MBCS)的转换过程都知道,这转换是比较耗时的,相对来说,unicode 转换要快的多,单始终还是要转换。

所以不转换是不是更好呢?
  • 打赏
  • 举报
回复
skywarship 2007-12-05
比如在文件中写入一个整数0x310a31,文件内容(16进制)就是310a31,作为文本文件会被认为是一个字符“1”,一个换行,和另一个字符“1”,但是作为二进制文件它存的是一个整数。如果让系统自动把0a改成0d0a,那作为二进制文件它保存的这个整数的值就变了。

注: 0a即\n,0d即\r
  • 打赏
  • 举报
回复
wendy_welcom 2007-12-05
“若这个文件是二进制文件,可能此处有特殊含义而不能随便改动内容” 能再具体一点吗,能举个例子么?谢谢
  • 打赏
  • 举报
回复
skywarship 2007-12-05
google一下文本文件和二进制文件的区别,会有更多收获
  • 打赏
  • 举报
回复
skywarship 2007-12-05
不同的系统对于文本文件中的换行符有不同的处理方法,GNU/Linux和UNIX系的换行符是"\n",windows系的是"\r\n", MAC OS 是"\r"。处理文本文件时系统会自动转换一下换行符,例如在windows下文件中的单个"\n"会自动换为"\r\n|,若这个文件是二进制文件,可能此处有特殊含义而不能随便改动内容,于是处理中会产生预料外的错误。
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.6w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2007-12-05 01:58
社区公告
暂无公告