[問題] 如何知道剛寫入的jpg檔有無毀損

看板C_and_CPP作者 (Willy)時間8年前 (2016/06/08 17:01), 8年前編輯推噓4(408)
留言12則, 5人參與, 最新討論串1/1
開發平台(Platform): GCC, Linux 額外使用到的函數庫(Library Used): 無 問題(Question):伺服器端接到裝置端傳回一組base64字串 decode完,用ofstream::open開了一個新的準備寫入檔案,再用ofstream::write寫入 成一個jpg檔,但為了防止有心人上傳一段假的base64字串,所以寫出來的jpg檔事實 上不是圖片檔,讀取會corrupt,請問我要如何再原本的main thread裡再以c++程式 檢測剛寫入的檔案,是否能讀取成功? 餵入的資料(Input):base64字串 預期的正確結果(Expected Output): 能判斷圖片檔寫入成功 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.133.16.181 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1465376519.A.1A6.html ※ 編輯: hn12404988 (220.133.16.181), 06/08/2016 17:03:47 ※ 編輯: hn12404988 (220.133.16.181), 06/08/2016 17:04:56

06/08 18:00, , 1F
裝imagemagick,用identify看他是圖檔還是什麼挖哥
06/08 18:00, 1F

06/08 18:00, , 2F
(當然你要用system()執行)
06/08 18:00, 2F

06/08 20:35, , 3F
然後就被黑了XD
06/08 20:35, 3F

06/08 20:39, , 4F
檢查jpg header?
06/08 20:39, 4F

06/08 20:42, , 5F
寬鬆的檢查,可看檔頭 SOI (FF D8) 檔尾 EOI (FF D9)
06/08 20:42, 5F

06/08 20:42, , 6F
06/08 20:42, 6F

06/08 20:43, , 7F
如果要嚴謹一點還是得把整個 JPEG structure 走一次
06/08 20:43, 7F

06/08 20:44, , 8F
system() 如果是公開伺服器得留意 command injection
06/08 20:44, 8F

06/08 20:44, , 9F
個人認為就是交給 jpeg decoder 來判斷就好
06/08 20:44, 9F

06/08 20:44, , 10F
用好一點的 JPEG library 讀資訊 (e.g. libjpeg-turbo)
06/08 20:44, 10F

06/13 07:36, , 11F
基本上JPG格式很鬆散 只要頭兩個位元是[255, 216]
06/13 07:36, 11F

06/13 07:37, , 12F
出來通常就不會corrupt, 頂多圖看起來是雜訊
06/13 07:37, 12F
文章代碼(AID): #1NLzy76c (C_and_CPP)