Archive for the ‘技术’ Category

HTTP POST GET 本质区别详解

HTTP POST GET 本质区别详解

Win7安装方法

各种Windows 7安装方法大汇总

为什么行结束符是CR+LF

这个故事要回溯到电传打字机的时代。CR表示的是“回车(carriage return)”,CR控制符将把打印头返回到第0列,但不会递进纸。LF表示的是“换行(linefeed)”,LF控制符将把纸递进一行,但不移动打印头。因此,如果你想把打印头返回到第0列并且将纸递进一行,那么就需要同时需要CR和LF。

在UNIX中将LF定义为行结束符。UNIX在遇到LF时,默认加上一个CR,因此在实际文件中只需写入LF就可以了,这就为每行节约了一个字节。

UNIX将这个约定写入到C语言的标准中,在C语言中,结束一行时只需使用\n,而在运行库中将会把LF转换为CR+LF。

为什么文本文件是以Ctrl+Z来结束的

事实上,文本文件并不需要以Ctrl+Z来结束,但在一些特殊的情况中存在着这个约定(不过幸运的是,现在这种情况是非常少的)。

这个故事要回溯到CP/M时代,CP/M的后继者通常被认为是MS_DOS(由于8086被视作为8080的后继者,因此8086上的操作系统也就很自然地被视作为8080上操作系统的后继者)。

在CP/M上,文件是被存储在扇区中,并且每个扇区的大小是128个字节。如果文件的大小是64个字节,那个这个文件将被存储在一个完整的扇区中。在CP/M操作系统中使用文件占用的扇区数量来作为文件的大小。如果文件不是128个自己的整数倍,那么你就需要某种方法来确定文件“真正的”结尾是在什么位置。

这就是Ctrl+Z所要解决的问题。

按照约定,在最后一个扇区未被占用的字节将用Ctrl+Z来填充。根据这个约定,如果某个程序在文件中进行读取操作,那么当程序读取到Ctrlz+Z是将会停止,因为这意味着程序现在读到了填充字节。

为了与CP/M保持一致性,在MS-DOS中沿用了Ctrl+Z的约定。这样,当你把文件从旧的CP/M机器上转换到新的PC上时,在文件的末尾就不会是垃圾数据。

虽然我们已经很长时间没有使用Ctrl+Z了,因为MS-DOS是按照自己的数量而不是扇区的数量来记录文件的大小。但在有些命令中仍然使用了这个约定,例如COPY命令。

为什么在转换到LPARAM之前会进行一个多余的转换

如果你阅读以前的代码,将会经常发现有类型转换看上去是多余的:

SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)(LPSTR)"str");

为什么“str”要首先被转换到LPSTR?这个字符串已经是个LPSTR!

这是在16位Windows中遗留下来的问题。我们还记得在16位Windows中声明指针时,默认情况下是生成一个近指针。因此,“str”是一个指向字符串的近指针。如果代码被写成下面这样:

SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)"str");

那么这个近指针将被转换为一个长整数值。由于近指针是16位的值,因此程序将通过零扩展把指针扩展为32位长整数。

然而,在窗口消息中,所有的指针都必须是远指针,因为接收消息的窗口过程可能与发送消息的代码是在两个不同的模块中。近指针需要和默认选择符组合在一起再使用,而在每个模块中的默认选择符是不同的。如果只是传递一个近指针给另一个模块,那么将会导致这个指针和接收模块的默认选择符放在一起使用,而这个默认选择符与发送模块的默认选择符是不同的。

不过在Win32中,你无需去担心这个问题了,你是不是应该感到很高兴?

巨指针百度百科

远指针百度百科

无觅相关文章插件,快速提升流量