posted in C/C++ 

广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较:

  1. 能存储的数据类型不同
    文本文件只能存储char型字符变量。
    二进制文件可以存储char/int/short/long/float/……各种变量值。

  2. 每条数据的长度
    文本文件每条数据通常是固定长度的。以ASCII为例,每条数据(每个字符)都是1个字节。
    二进制文件每条数据不固定。如short占两个字节,int占四个字节,float占8个字节……

  3. 读取的软件不同
    文本文件编辑器就可以读写。比如记事本、NotePad++、Vim等。
    二进制文件需要特别的解码器。比如bmp文件需要图像查看器,rmvb需要播放器……

  4. 操作系统对换行符('\n')的处理不同(不重要)
    文本文件,操作系统会对'\n'进行一些隐式变换,因此文本文件直接跨平台使用会出问题。

  • 在Windows下,写入'\n'时,操作系统会隐式的将'\n'转换为"\r\n",再写入到文件中;读的时候,会把“\r\n”隐式转化为'\n',再读到变量中。
  • 在Linux下,写入'\n'时,操作系统不做隐式变换。

二进制文件,操作系统不会对'\n'进行隐式变换,很多二进制文件(如电影、图片等)可以跨平台使用。
     

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/28499615

posted in 网络 

以126邮箱为例:

1. telnet smtp.126.com 25

回车后返回:

220 126.com Anti-spam GT for Coremail System (126com[20111010])

  1. **helo *** ****     **(***是你的称呼)

回车后返回:

250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFDikmCUCa0xD
UUUUj
250-STARTTLS
250 8BITMIME

3. AUTH LOGIN

回车后返回:

334 dXNlcm5hbWU6

4.**** (此处输入你126账号的base64编码)

回车后返回:

334 UGFzc3dvcmQ6

5.****(此处输入你126邮箱的密码的base64编码)

回车后返回:

235 Authentication successful

6.mail from < ***@126.com>

回车后返回:

250 Mail OK

7.rcpt to <60462***@qq.com>

回车后返回:

250 Mail OK

8.data

回车显示:

354 End data with .

9.依次输入

from:***@126.com(输完后回车)

subject:hello haha

下面需要输入正文,

输入正文前要空一行,敲回车

 

“这里是正文信息,祝大家实验顺利!!!”

10.正文完毕后,回车,

以"." 表示结束,发送邮件。

返回类似这样的信息:

250 Mail OK queued as smtp6,j9KowLDLJl6zvKpOqxAVAQ--.2456S2 1319812760

参考:

SMTP协议初探

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/25902755

posted in 网络 

具体步骤:

nslookup -type=ns 126.com 192.5.5.241
nslookup -type=ns 126.com 192.5.6.30
nslookup -type=a 126.com 54.86.137.107

192.5.5.241      是一个根DNS服务器的的IP

192.5.6.30        是一个com级DNS服务器的IP

54.86.137.107 是一个126权威DNS服务器的IP

问题:

nslookup查得的IP和ping查得的IP为什么不一致?

The reason that nslookup can operate differently to ping is that,
ping uses the system-supplied library, as used by other applications, for name-to-address mapping, 
whereas nslookup has its own, built in, DNS client library. [1]

参考:

[1] nslookup-results-different-to-ping

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/25900609

问题:

最近在看“龙书”(Compilers Principles, Techniques and Tools)

Windows下编译附录A的代码,没有报错,

然而当尝试运行编译器

<span style="font-size:14px;">java main.Main <test</span>

却总是报错:

<span style="font-size:14px;">Exception in thread "main" java.lang.Error: near line 1: syntax error
at parser.Parser.error(Parser.java:15)
at parser.Parser.match(Parser.java:19)
at parser.Parser.assign(Parser.java:116)
at parser.Parser.stmt(Parser.java:110)
at parser.Parser.stmts(Parser.java:62)
at parser.Parser.block(Parser.java:30)
at parser.Parser.program(Parser.java:23)
at main.Main.main(Main.java:9)</span>

解决:

尝试了各种方法,都没有解决问题。

万般无奈下在Linux下编译运行了一下,结果居然没有报错!

可见以后Unix环境下的程序,还是老老实实在Linux下编译运行的好~!

原因分析:

然后我闲的蛋疼,多花了近两个小时,找出了出错的原因。

<span style="font-size:14px;">Unix系统里,每行结尾只有“<换行>”,即“\n”;
Windows系统里面,每行结尾是“ <回车><换行>”,即“\r\n”;
Mac系统里,每行结尾是“<回车>”。</span>

"龙书"中的源码只处理Unix系统眼中的“换行”,

Windows系统下相比于Unix多了一个“回车”,

这就导致编译器无法处理,进而出错了。

拓展阅读:

回车符和换行符区别【Windows和Linux换行符的区别】

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/24517609

posted in C/C++ 

问题:

在C语言中,我们可以这样

char s[]="hello";

或者

char *s ="hello";

那么这两个到底有什么不同?

解答:

区别如下:

char *s = "Hello world";

会把Hello world放进内存的只读部分,声明一个指针s指向它。任何对这个只读内存的写操作都是非法的。然而执行下面语句:

char s[] = "Hello world";

会把字符串放进内存的一个只读区域,然后把这个字符串复制到一个栈中新分配的内存。因此,

s[0] = 'J';

是合法的。

英文原地址:

what-is-the-difference-between-char-s-and-char-s-in-c

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/24270237

posted in OJ题解 

问题:

假设有两个区间M(s1, e1)和N(s2, e2),如何判断两个区间是否有交集?

解答:

命题A: M和N相离,且M在前N在后。(当 s2 > e1时成立)

命题B: M和N相离,且M在后N在前。  ( 当 s1 > e2时成立)

如果命题(A or B)为真,则两个区间每有交集。

则如果命题(A or B)都为假,则两个区间有交集。

根据德摩根定律可知:

!(A or B) = !A and !B

也就是说 (s2 <= e1) and (s1 <= e2)

原文:http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/23614635

posted in C/C++ 

Segmentation fault这种错误,通常是由于访问了"不属于你"的内存引起的。这种帮助机制防止你把内存搞得一团糟以及引入难以调试的Bugs。每当你看到segfault提示的时候,你应该知道你错误的访问了内存——比如访问已经释放的变量,写数据到内存的只读部分,等等。在大多数可能搞乱内存的语言中,segfault基本是一样的,在C和C++中没有什么大不同。

至少在C(++)这种底层语言中,有多种方法可以导致segfault的提示。

① 一种常见的导致提示segfault方法是访问空指针指向内存的值。

int *p = NULL; *p = 1;

② 另一种提示segfault的情况是,你向只读内存中写数据。

char *str = "Foo"; // 编译器认为常量字符串是只读的 *str = 'b'; // 所以这行语句非法,从而提示segfault

③ 以及悬垂指针指向一个不再存在的变量,如下所示:

char *p = NULL; { char c; p = &c; } // 现在p是悬垂的了

p变成了悬垂指针,因为它指向了一个花括号之外就不存在的变量c。而且当你给这个悬垂指针指向的内存赋值(如 *p='A')时,你很可能得到一个segfault的提示。

原文:http://stackoverflow.com/questions/2346806/what-is-segmentation-fault

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/23613597

/** * RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS. * LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/ /* var disqus_config = function () { this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable }; */ (function() { // DON'T EDIT BELOW THIS LINE var d = document, s = d.createElement('script'); s.src = 'https://chenzz.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })();