2014-02-28 16 views
-1

제 요구 사항은 파일이 jpeg/jpg/png인지 확인하는 것입니다. 다음 코드를 작성했습니다.이미지 파일의 유효성을 검사하기 위해 파일의 마법 번호를 확인했습니다. 파일의 매직 번호를 변경할 수 있습니까?

public boolean isFileValid(File file) throws IOException { 
     DataInputStream input = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); 
     int fileSignature = input.readInt(); 
      input.close(); 
     logger.info(fileSignature); 
     if (fileSignature == 0xffd8ffe0) { 
      logger.info("File is jpeg"); 
      return true; 
     } else if(fileSignature == 0x89504E47){ 
      logger.info("file is in PNG"); 
      return true; 
     } else {return false;} 

    } 

내가 우분투를 13.04를 이용하고 있고 위의 코드 나랑 잘 동작은 파일의 서명이 doesnot 다양한 OS마다 다를 (내가 다른 OS에서 테스트 havenot으로 그래도 난이 매우 확실하지 않다) 읽어 보시기 바랍니다 또한 파일의 서명을 변경할 수 있습니까? 타사 라이브러리를 사용하지 않고도이 작업을 수행 할 수있는 더 좋은 방법이 있습니까?

+1

'경우 (fileSignature == 0xffd8ffe0) {} 다른 경우 (fileSignature == 0xffd8ffe0) {}'? ? –

답변

2

처음에는 잘못된 JPG 매직 번호가 있습니다. 길이가 4 바이트가 아니고 두 개만 있으며 0xffd8 (매직 넘버의 처음 부분)입니다. 그리고 당신이 무엇을 요구하는지 이해한다면, 매직 넘버는 파일 타입 명세에 의해 정의되며, 어떤 플랫폼에서든 언제나 똑같을 것으로 가정됩니다. 솔직히 말해서, 당신이 다른 매직 넘버를 가지고 있다면, 당신이 찾고있는 파일이 아닙니다. 동일한 파일 유형에 여러 개의 마법 번호가있는 경우 드문 예외가 있지만 일반적으로 이전/다른 각주와 호환됩니다.

또한 파일에 올바른 매직 번호가 있으면 반드시 올바른 유형의 파일임을 의미하지는 않습니다. 전문적으로, 당신의 접근 방식은 올바른 png/jpg 이미지와 같은 데이터로서 만 마법 번호로 파일을 "레이블링"합니다.

따라서 magic number를 확인하는 것은 파일이 유효한 png/jpg인지 확인하는 과정에서 첫 단계 (다소 "파일 유형 해시 값"이라고 생각할 수 있습니다.)이지만 마법 번호 확인이 통과되면 계속 진행해야합니다 파일 구조를 분석하고 해당 파일이 스펙에 따라 의미있는 파일 데이터를 포함하는지 여부를 확인하는 데 있습니다.

쉽게 위키 피 디아의 사양 (공식 사양 실제 링크를) 찾을 수 http://en.wikipedia.org/wiki/Portable_Network_Graphics#Technical_details http://en.wikipedia.org/wiki/JPEG#Syntax_and_structure