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