2013-03-21 39 views
5

Tôi đang có một yêu cầu mà tôi cần phải xác định loại hình ảnh không phải bởi phần mở rộng tệp nhưng bằng cách xác thực tiêu đề. Tôi đang cố gắng xác thực một tệp JPEG bằng xác thực số ma thuật.Java xác nhận tiêu đề hình ảnh

File imgFile = 
    new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"); 
byte[] ba = Files.toByteArray(imgFile); //Its a google guava library 
int i = 0; 
if(ba [i] == 0xFF && ba[i+1] == 0xD8 && ba[i+2] == 0xFF && ba[i+3] == 0xE0){ 
    System.out.println("isJPEG"); 
} 

Nhưng điều kiện không hề thỏa mãn. ba[i] trả về -1.

Tôi đang làm gì sai?

+0

liên quan: http://stackoverflow.com/q/1915317/1055089 – Vrushank

Trả lời

2

Trong Java các byte nguyên thủy được ký kết và có một phạm vi từ -128 đến 127, có nghĩa là ba[0] bạn đi ra như -1, trong khi 0xFF được hiểu như là một int như 255. Nếu bạn làm một phép toán AND với 0xFF sử dụng toán tử & này chuyển đổi các byte ký hợp đồng với giá trị đúng và mã của bạn sẽ làm việc, như sau:

File imgFile = 
      new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"); 
     byte[] ba = Files.toByteArray(imgFile); //Its a google guava library 
     int i = 0; 
     if((ba [i] & 0xFF) == 0xFF && (ba[i+1] & 0xFF) == 0xD8 && (ba[i+2] & 0xFF) == 0xFF 
      && (ba[i+3] & 0xFF) == 0xE0) { 
      System.out.println("isJPEG"); 
     } 

Tôi không chắc chắn về logic chính xác mà bạn đang sử dụng tuy nhiên , như wikipedia khẳng định rằng những con số kỳ diệu cho hình ảnh JPEG như sau:

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

FF E0 là JFIF cụ thể, vì vậy bạn m ay muốn kiểm tra lý do tại sao bạn đang kiểm tra cho điều này

tăng gấp đôi Sau đây sẽ là mã để sử dụng để tiến hành kiểm tra theo Wikipedia:

 File imgFile =     
        new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"); 
     byte[] ba = Files.toByteArray(imgFile); //Its a google guava library 
     int i = 0; 
     if((ba [i] & 0xFF) == 0xFF && (ba[i+1] & 0xFF) == 0xD8 && (ba[ba.length - 2] & 0xFF) == 0xFF 
      && (ba[ba.length - 1] & 0xFF) == 0xD9) { 
      System.out.println("isJPEG"); 
     } 
+0

Cảm ơn bạn. Đã hoạt động. Tôi đoán tôi cần phải nhìn nhiều hơn vào các hoạt động ditwise. – karthick

+0

Bạn được chào đón. Tất cả các kiểu dữ liệu số nguyên thủy trong Java được ký và được biểu diễn bằng ký hiệu bổ sung của Two, xem tại đây: http://en.wikipedia.org/wiki/Two's_complement. Bạn sẽ nhận thấy rằng 255 chưa ký là -1 khi được biểu diễn trong phần bổ sung của Two –

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