陳凱
對(duì)計(jì)算機(jī)來說,不管在記事本中輸入的是什么字符,其在本質(zhì)上都是存儲(chǔ)了一段二進(jìn)制數(shù)據(jù)。如果輸入的是英文或數(shù)字,那么記事本會(huì)用ASCII碼將這些符號(hào)編碼成二進(jìn)制數(shù)據(jù);反過來,如果一段二進(jìn)制數(shù)據(jù)是用ASCII碼編制而成的,那么記事本就能將這些數(shù)據(jù)還原成英文或數(shù)字符號(hào)。但如果那些數(shù)據(jù)不是用ASCII碼編制而成的,那用記事本打開后,會(huì)看到什么呢?有人說,那樣會(huì)得到一串亂碼——先別著急下結(jié)論,來看這樣一個(gè)實(shí)驗(yàn)。
用記事本看畫圖
打開Windows的畫圖軟件,在整個(gè)矩形的畫布上傾倒紅色,并保存該文件為24位色的位圖,命名為test1.bmp,然后再往畫布上傾倒紫色(可在“編輯顏色”中選取某種紫色),并保存為24位色的位圖,命名為test2.bmp。接著用記事本分別打開這兩個(gè)BMP格式的圖像文件,發(fā)現(xiàn)顯示的效果是不同的(如圖1)。
紅色的圖像文件用記事本打開后,除了在第一行有一些看不懂的與圖像格式有關(guān)的信息外,其他就是許多行的空格,而紫色的圖像文件用記事本打開后,里面鋪滿了字符“f?f”,顯得很有規(guī)律,這顯然不是用“亂碼”一詞就能搪塞過去的。當(dāng)然,讀者自己在嘗試時(shí),因?yàn)檫x的紫色的色彩濃度和筆者未必一樣,所以出現(xiàn)的字符也有可能是不一樣的。
由于24位的位圖文件中的每個(gè)像素的顏色即紅、綠、藍(lán)各占8位bit存儲(chǔ)空間,而ASCII碼與擴(kuò)展ASCII碼占去的內(nèi)存空間也正好8位,因此不妨猜測(cè),“f?f”中的三個(gè)字符分別代表了RGB值中的藍(lán)色、綠色和紅色的顏色值(BMP格式文件中的顏色是按藍(lán)、綠、紅的順序來索引的)。查ASCII碼表可知,“f”的值為01100110,“?”的值為00111111,因此,每個(gè)像素點(diǎn)的顏色值是“01100110”“00111111”和“01100110”,換成十進(jìn)制就是“102”“63”和“102”。在畫圖軟件的“編輯顏色”窗口中輸入這三個(gè)值后,發(fā)現(xiàn)選中的顏色正是紫色,于是先前的猜想得到了驗(yàn)證(如圖2)。
至于紅色,因?yàn)槠銻GB值分別是紅色11111111、綠色00000000和藍(lán)色00000000,這些值恰巧都對(duì)應(yīng)了非字符類型的ASCII碼,所以記事本就只好以空格代之。
用顏色隱藏ASCII字符
基于以上原理,可以做一個(gè)有趣的實(shí)驗(yàn),將詞語隱藏在BMP格式的圖像中。例如,將“CAT”一詞隱藏到一幅小貓的圖畫中,具體怎么做呢?
①找到字符“C”“A”和“T”的ASCII碼的十進(jìn)制值,“C”為67,“A”為65,“T”為84。
②打開畫圖軟件的“編輯顏色”窗口,在顏色值中輸入紅色為84,綠色為65,藍(lán)色為67,然后就得到了一種灰中帶淡紫的顏色(注意是按藍(lán)、綠、紅的順序編碼)。
③將這種顏色在畫布上隱蔽的地方點(diǎn)上幾點(diǎn),然后保存為24位色的BMP格式文件。
④用記事本打開這個(gè)BMP圖像文件,滿篇“亂碼”中就隱藏著“CAT”一詞,不妨查找一下。
用類似的方法,只要有耐心,就可以在圖畫中隱藏大段有含義的文字,這項(xiàng)游戲不僅有趣,同時(shí)還涉及ASCII碼和位圖編碼的知識(shí)。最后留給讀者一個(gè)有難度的任務(wù):請(qǐng)存儲(chǔ)一張小貓的BMP位圖,要求用圖畫軟件打開時(shí)能正常顯示一只貓,而用記事本打開后,則可在一片“亂碼”中找出“喵”字。