作者TeaEEE (愛不趴 不愛趴)
看板C_and_CPP
標題Re: [問題] 面試遇到readByte
時間Fri May 20 09:56:46 2011
※ 引述《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