t.me/atinfo_chat Telegram группа по автоматизации тестирования

Побитовый анализ файлов ?


(Taras) #1

Есть такое понятие как сравнение ожидаемого результата с актуальным, тоесть тем который current. Так вот слыхал, о такой технологии как побитовый анализ файлов.

Например есть задача распознать тот ли рисунок открылся или заугрзился не по имени или локации рисунка а по содержанию, тоесть грубо говоря "то ли нарисовано".

Слыхал что есть тулзы (может и библиотеки), которые распознают файлы побитово и анализируют равны ли структуры.

Интересует как это реалиовать на практике в автоматизации. Сейчас не идет речь о рисунках, так как етсть sikuli и тому подобные вещи, а о файлах в общих чертах. Спасибо!


(Дмитрий Жарий) #2

Если Выс устраивает побитовое (бинарное) совпадение с бейслайном (эталоном, с которым Вы сравниваете), 

то для этого можно использовать тулзу diff  с ключем --binary; которая есть для всех операционных систем:

http://ru.wikipedia.org/wiki/Diff

 

Сам же sikuli использует библиотеку OpenCV, которая позволяет сравнивать картинки с некоторой степенью "неточного" совпадения.

 


(Mykhailo Poliarush) #3

можно попробовать что-то из списка http://file.software.informer.com/download-file-comparison-java-library/

 /**
    * Compare binary files. Both files must be files (not directories) and exist.
    * 
    * @param first  - first file
    * @param second - second file
    * @return boolean - true if files are binery equal
    * @throws IOException - error in function
    */
   public boolean isFileBinaryEqual(
      File first,
      File second
   ) throws IOException
   {
      // TODO: Test: Missing test
      boolean retval = false;
      
      if ((first.exists()) && (second.exists()) 
         && (first.isFile()) && (second.isFile()))
      {
         if (first.getCanonicalPath().equals(second.getCanonicalPath()))
         {
            retval = true;
         }
         else
         {
            FileInputStream firstInput = null;
            FileInputStream secondInput = null;
            BufferedInputStream bufFirstInput = null;
            BufferedInputStream bufSecondInput = null;

            try
            {            
               firstInput = new FileInputStream(first); 
               secondInput = new FileInputStream(second);
               bufFirstInput = new BufferedInputStream(firstInput, BUFFER_SIZE); 
               bufSecondInput = new BufferedInputStream(secondInput, BUFFER_SIZE);
   
               int firstByte;
               int secondByte;
               
               while (true)
               {
                  firstByte = bufFirstInput.read();
                  secondByte = bufSecondInput.read();
                  if (firstByte != secondByte)
                  {
                     break;
                  }
                  if ((firstByte < 0) && (secondByte < 0))
                  {
                     retval = true;
                     break;
                  }
               }
            }
            finally
            {
               try
               {
                  if (bufFirstInput != null)
                  {
                     bufFirstInput.close();
                  }
               }
               finally
               {
                  if (bufSecondInput != null)
                  {
                     bufSecondInput.close();
                  }
               }
            }
         }
      }
      
      return retval;
   }

взято из http://www.java2s.com/Code/Java/File-Input-Output/Comparebinaryfiles.htm


(Kedanachi) #4

Я бы добавил перед чтением файла проверку на размер. Нет смысла проверять на идентичность файлы разного размера.


(Taras) #5

класс isFileBinaryEqual создает обьект по двох полях и сравнивает их сразу, ибо он true возвращает когда 2 поля (файла) равны или как он работает ???


(Kedanachi) #6

Метод открывает для каждого файла поток. Одновременно читает из каждого по байту и сравнивает их. Так продолжается до тех пор пока байты не станут разными (вернет false) либо пока не будет достигнут одновременно конец обоих потоков (вернет true).


(Taras) #7

я помострел верхушку и подумал что это клас )))))

не увидел что там скобки не фигурные ))))

теперь все ясно, сори зв мою невнимательность)


(Mykhailo Poliarush) #8

это ты хочешь канвас побитовым сравнением проверять?


(Taras) #9

а не не, это просто вопрос такой, с канвасом я вообще не знаю что делать)