2010-12-28 25 views
22

Tôi có một mảng byte nhỏ (dưới 25K) mà tôi nhận và giải mã như là một phần của phong bì thư lớn hơn. Đôi khi đây là một hình ảnh, và khi nó là hình ảnh, đôi khi nó là một jpg. Tôi không có thông tin ngữ cảnh nào khác ngoài mảng byte và cần xác định cả hai nếu đó là hình ảnh và nếu hình ảnh thuộc loại jpg.Cách xác định nội dung của một byte [] là một jpeg?

Có một số ma thuật hoặc các byte ma thuật tồn tại ở đầu, cuối hoặc tại một số khoảng bù mà tôi có thể xem xét để xác định nó không?

Một ví dụ về mã của tôi trông như thế này (từ bộ nhớ, không phải c/p):

byte[] messageBytesAfterDecode = retrieveBytesFromEnvelope(); 
if(null != messageBytesAfterDecode && messageBytesAfterDecode > 0){ 
    if(areTheseBytesAJpeg(messageBytesAfterDecode)){ 
     doSomethingWithAJpeg(messageBytesAfterDecode) 
    }else{ 
     flagEnvelopeAsHavingBadContentInTheField(); 
    } 
} 

Tôi thực sự cần điều gì sẽ đi vào phương pháp

areTheseBytesAJpeg(byte[] mBytes){} 

, hoặc thậm chí một con trỏ với thông số chi tiết. Tôi hy vọng có một cách rất nhanh chóng để đưa ra quyết định này, kể từ khi tôi không thực sự muốn đọc chúng thành một hình ảnh vv

Trả lời

43

Từ wikipedia:

tập tin hình ảnh JPEG bắt đầu với FF D8 và kết thúc bằng FF D9.

http://en.wikipedia.org/wiki/Magic_number_(programming)

+1

tất cả google - thậm chí nó được đặt trong kết quả: http://www.google.com/search?&q=jpg+magic+number – zsalzbank

+0

Tốt. Hãy để tôi chạy thử nghiệm của tôi và tôi sẽ trở lại! – Kylar

+0

thực sự tuyệt vời! của tôi là một nửa wikipedia, một nửa firefox. Phải là những gì làm tôi chậm lại. –

0

Một file JPG không có một tiêu đề cụ thể mà bạn có thể sử dụng để xác định một khả năng rất tốt mà nó là một file JPG. Tuy nhiên, nó không rõ ràng nếu bạn sẽ có toàn bộ tập tin trong mảng byte.

Dù sao, đây là chi tiết cụ thể về tiêu đề: http://www.fastgraph.com/help/jpeg_header_format.html

5

Trích dẫn this wikipedia article:

tập tin hình ảnh JPEG bắt đầu với FF D8 và cuối với FF D9. Các tệp JPEG/JFIF chứa mã ASCII cho "JFIF" (4A 46 49 46) dưới dạng chuỗi bị chấm dứt null. Tệp JPEG/Exif chứa mã ASCII cho "Exif" (45 78 69 66) cũng như một chuỗi bị hủy, theo sau là siêu dữ liệu khác về tệp.

+0

Lưu ý, mặc dù, một số JPEG không có 4A 46 49 46 cũng như 45 78 69 66 ở vị trí đó (mặc dù hầu hết tôi đã thấy). Không phải là một chuyên gia về công cụ này, nhưng tôi đang xem một JPEG có 50 68 6F 74 ở vị trí đó; tương ứng với "Phot" ASCII trong "Photoshop", mặc dù tôi đã lưu ảnh JPEG theo nhiều cách từ Photoshop và không thể sao chép được. (Photoshop, tuy nhiên, nhận ra tệp này dưới dạng JPEG, cũng như Windows và OS X.) Tệp này không chứa JFIF cũng như các ký hiệu Exif ANYWHERE. Cuối cùng, tệp DOES bắt đầu bằng FF D8 và kết thúc bằng FF D9 (vì nó nên là một JPEG). –

3

Rất nhiều định dạng được xác định bằng các số ma thuật. Đây là những chuỗi byte thường ở phía trước của tập tin để xác định xem dữ liệu nhị phân sau đây thực sự là những gì bạn nghĩ nó. Tìm kiếm google nhanh chóng trả lại: http://www.linfo.org/magic_number.html và cụ thể trích dẫn:

"Tương tự, số ma thuật thường được sử dụng cho tệp hình ảnh JPEG (Joint Photographic Experts Group) là 0x4A464946, tương đương ASCII của JFIF (Định dạng trao đổi tệp JPEG) Tuy nhiên, các số ma thuật JPEG không phải là các byte đầu tiên trong tệp, thay vào đó, chúng bắt đầu bằng byte thứ 7. Các ví dụ bổ sung bao gồm 0x4D546864 cho các tệp MIDI (Nhạc cụ kỹ thuật số) và 0x425a6831415925 cho các tệp nén bzip2. "

+0

Jfif không nhất thiết phải giống như jpeg. Mặc dù, những gì hầu hết mọi người có ý nghĩa khi họ nói jpeg, thực sự là jfif, vì họ cho rằng nó sử dụng YUV như một định dạng màu. – onemasse

+1

Xin lưu ý rằng bình luận @onemasse lại có nhiều JPEG là Exif, không phải JFIF, ví dụ như nhiều ảnh JPEG được chụp bằng máy ảnh kỹ thuật số, nhiều JPEG được lưu từ Photoshop (có nghĩa là nhiều JPEG được tìm thấy trên web), v.v. Điều này dựa trên kinh nghiệm cá nhân của tôi, nhưng có nhiều hơn ở đây: http://en.wikipedia.org/wiki/JPEG_File_Interchange_Format. –

5

Một nguồn "kiến thức" khác về số ma thuật (bao gồm tệp JPEG) là tệp magic được sử dụng bởi lệnh GNU/Linux file.

Nếu bạn có lệnh file được cài đặt, thì file --version sẽ cho bạn biết thời gian tệp magic sống ở đâu và bạn có thể đọc nó bằng trình chỉnh sửa văn bản ... và đọc cẩn thận man 5 magic.

(Và magic nội dung tập tin xác nhận các chi tiết của câu trả lời khác.)

6

Một số thông tin thêm về định dạng tập tin khác với jpeg: ban đầu của tập tin chứa các byte

BMP : 42 4D 
JPG : FF D8 FF EO 
PNG : 89 50 4E 47 
GIF : 47 49 46 38 

một số mã:

private static Boolean isJPEG(File filename) throws Exception { 
    DataInputStream ins = new DataInputStream(new BufferedInputStream(new FileInputStream(filename))); 
    try { 
     if (ins.readInt() == 0xffd8ffe0) { 
      return true; 
     } else { 
      return false; 

     } 
    } finally { 
     ins.close(); 
    } 
} 
+1

Khi tệp JPG sử dụng JFIF hoặc EXIF, chữ ký khác nhau: Nguyên: FF D8 FF DB; JFIF: FF D8 FF E0; EXIF: FF D8 FF E1 –

Các vấn đề liên quan