徹底搞定0x0d和0x0a
Posted on 2008-09-18 15:01 Prayer 閱讀(11376) 評(píng)論(0) 編輯 收藏 引用 所屬分類: C/C++ 、LINUX/UNIX/AIX什么是0x0d和0x0a,可能大部分人都知道是回車和換行字符,但那個(gè)是回車,那個(gè)是換行?估計(jì)很多人都一時(shí)說不清楚了---也許你不相信,那就調(diào)查下周圍的同事吧,估計(jì)會(huì)包含以下字眼“大概。。。我記得。。。回車是0x0d吧”。這次我移植arm-linux C的程序,至VC++,發(fā)現(xiàn)了很多不同,尤其是這個(gè)回車換行浪費(fèi)我一上午的時(shí)間,我決定借此機(jī)會(huì)徹底搞定他們,這兩個(gè)令人討厭的家伙。
先說下浪費(fèi)我一上午的那個(gè)東西----教訓(xùn)是很重要的,希望大家不要重蹈我的覆轍----,在arm-linux下,寫二進(jìn)制文件,打開文件的時(shí)候 這樣寫就可以了fp_wthdisk = fopen(file_pathname,"w");,以w格式寫就可以了。把這段程序移植到vc++后,發(fā)現(xiàn)一旦我向文件寫入0x0a,前邊就會(huì)自動(dòng)加上0x0d,我以為是我寫入數(shù)組的問題,反復(fù)檢查也沒有找到毛病,后來同事問我:“你是不是二進(jìn)制格式寫入的文件?”我說:“是呀,fwrite w格式,沒有問題呀”,后來他說,你試試“wb格式寫入一下”,改為wb后,果真就好了,厲害!,我對(duì)他豎起了大拇指。
看到這里,上邊促使我下決心搞清楚回車換行的原因說完了。我想可能有人會(huì)犯同樣錯(cuò)誤的。但如果你對(duì)以下幾個(gè)問題,都知曉了,就不必浪費(fèi)時(shí)間,繼續(xù)看下去了。
1.在Windows XP Visual C++下,按下回車鍵,系統(tǒng)獲得的字符是0x0d還是0x0a,還是0x0d和0x0a?
2.回車(0x0d)的作用是回到本行的行首位置,表示本行已經(jīng)輸入完畢,停留在最后一個(gè)位置,還是光標(biāo)轉(zhuǎn)移到下一行的起始位置?
。。。。
1.的答案是僅獲得字符 0x0d
2.答案是回車的作用只是移動(dòng)光標(biāo)至該行的起始位置
注意:回車和換行在不同環(huán)境下的意義不同,正如sleep(1)和Sleep(1)【注意S大寫】這兩個(gè)函數(shù)的不同一樣,sleep(1)在linux下表示延時(shí)1s,而Sleep(1)在vc++下表示延時(shí)1ms,如果不依據(jù)環(huán)境來討論回車和換行,是無意義的,只能是讓人們誤入歧途和浪費(fèi)時(shí)間。
我只在arm-linux C和vc++下做了試驗(yàn),請(qǐng)大家在接觸其它語言環(huán)境下,小心推廣,不行就自己動(dòng)手做試驗(yàn),最可靠。在arm-linux C和vc++下回車換行的意義如下。
回車 代碼:CR ASCII碼:\ r ,十六進(jìn)制,0x0d,回車的作用只是移動(dòng)光標(biāo)至該行的起始位置;
換行 代碼:LF ASCII碼:\ n ,十六進(jìn)制,0x0a,換行至下一行行首起始位置;
Linux和windows下,回車試驗(yàn)
sprintf(versionbuf,"%s","TEST_VERSION_1_0_11\rabcdefg\r34567\n");
printf("%s",versionbuf);
均打印輸出:34567fgRSION_1_0_11,證明了以上結(jié)論。
其實(shí)回車和換行之所以把大家搞迷糊的一個(gè)重要原因,是大家把鍵盤的 “回車鍵”,0x0d表示“回車”,我們?cè)趙indows下的txt文件下敲下的回車鍵等情況攪在了一起。在鍵盤上敲下回車鍵,在不同軟件下獲得字符大有不同。
Windows下在txt文件中敲下回車鍵,然后16進(jìn)制觀察,你會(huì)發(fā)現(xiàn)獲得了2個(gè)字符,0x0d和0x0a,這個(gè)大家都知道,但這不意味著,在任何情況下敲下回車鍵,都會(huì)獲得0x0d和0x0a。
在linux下,你對(duì)一個(gè)文件,敲下回車鍵,你就會(huì)發(fā)現(xiàn),它每次只增加一個(gè)字符。