看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《glitzie (GZ)》之銘言: : 面試遇到的問題, 我當時整個人傻掉 : 他要我舉出下列程式隱藏的問題 : bool ProcessEvilInput::onDecode(SkStream* stream, SkBitmap* bm, : SkBitmap::Config pref, Mode mode) : ... : int width = readByte(buf, 6 + i*16); : int height = readByte(buf, 7 + i*16); : if (stream->read((void*)buf, length) != length){ : return false; : } : int offset = read4Bytes(buf, 18 + i*16); : int bitCount = read2Bytes(buf, offset+14); : switch (bitCount) : { : case 1: : case 4: : c = SkBitmap::kIndex8_config; : break; : case 8: : case 24: : case 32: : c = SkBitmap::kARGB_8888_config; : break; : default: : RETURN_ERROR(("Image with %d not supported\n", bitCount)); : continue; : } : ... : } 這題我覺得出的不是很好,由於程式碼前有... 整個程式的邏輯就不易理解。 這段code真的說有問題的話,我覺得是出在stream-read的位置 int width = readByte(buf, 6 + i*16); int height = readByte(buf, 7 + i*16); if (stream->read((void*)buf, length) != length){ return false; } 這段code中說的是希望從buf中解讀出width與height,但是stream-read是在解讀完width height之後就很奇怪了,如果...中沒有做過stream->read的話,則width / height值可 能是記憶體中隨機的資料,則資料的解讀造成錯誤,如果說在...中有做過stream->read 的話,則width / height與offset / bitcount則代表的是不同frame的影像資料,一樣會 造成資料解讀上的問題。 另一個可能的錯誤推測則是在於readByte(buf, n + i*16)上,這樣的碼看起來會有一個 for loop去解讀許多frame的資料,所以buf可能包含了1個以上的frame,如果是這樣則 stream->read應該要在for loop之前進行,而不是夾在height read之後 這題考的比較不是像C++語法的東西,而是對檔案影像資料解讀的知識 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.67.30.1
ledia:他也沒說前面沒有 stream read 過啊 XD 05/20 11:10
ledia:看看它的名字, ProcessEvilInput, 從這邊猜比較合理吧? XD 05/20 11:11
purpose:很多都要從名字猜,很棘手...有些人,資料型態、函數實作 05/20 11:15
purpose:改過了,但是註解沒改、名稱也沒改,這時候就會撞牆囉 05/20 11:15
yauhh:原問是說有?藏的問題,no commment is not one of those 05/20 18:16