Два BIN-файла с одинаковым именем и размером могут отличаться всего в нескольких байтах — и именно эти байты решают, запустится ли прошивка на устройстве или плата уйдёт в циклическую перезагрузку. Обычное сравнение «по размеру» здесь не работает: совпадение объёма не гарантирует идентичность содержимого, а текстовые редакторы вообще не способны корректно открыть бинарный формат.
Задача сравнения BIN-файлов возникает при проверке прошивок микроконтроллеров, дампов памяти, образов дисков и BIOS. В зависимости от цели — найти конкретные отличающиеся байты, подтвердить идентичность копии или сравнить две версии прошивки — подбирается свой инструмент: от встроенных команд операционной системы до специализированных hex-редакторов. Ниже разберём рабочие методы для Windows и Linux.
Что такое BIN-файл и почему его нельзя сравнить как текст
Расширение .bin — это не единый стандарт, а общее обозначение «сырых» бинарных данных. Под ним могут скрываться прошивка для STM32 или ESP32, дамп микросхемы EEPROM, образ оптического диска (в паре с файлом .cue) или скомпилированный исполняемый код. Структуру такого файла понимает только то устройство или программа, для которых он создан.
Текстовые diff-утилиты сравнивают содержимое построчно и опираются на символы перевода строки. В бинарном файле байты 0A и 0D могут быть частью данных, а не разделителями строк, поэтому текстовое сравнение даёт бессмысленный результат или вовсе сообщает, что «файлы бинарные и различаются» без деталей. Нужны инструменты, работающие на уровне отдельных байтов.
Побайтовое сравнение показывает не только факт различия, но и точные смещения (адреса) отличающихся байтов и их значения в обоих файлах. Это критично при анализе прошивок: по адресу изменения часто можно понять, какой участок кода или какая настройка затронуты.
Быстрая проверка идентичности через контрольные суммы
Если задача — просто убедиться, что два файла одинаковы (например, проверить, не повредилась ли прошивка при копировании), самый быстрый путь — сравнить хеш-суммы. Файлы с совпадающим хешем можно считать идентичными; разный хеш означает, что содержимое отличается, хотя и не показывает, где именно.
В Windows для этого есть встроенная утилита certutil, а в Linux и macOS — команды семейства sha256sum или md5sum:
certutil -hashfile firmware_v1.bin SHA256sha256sum firmware_v1.bin firmware_v2.bin
- 🔍 MD5 — быстрый, подходит для контроля целостности копий, но не для проверки на преднамеренную подмену.
- 🔐 SHA-256 — надёжный вариант, когда важно исключить коллизии, например при сверке скачанной прошивки с эталонной суммой от производителя.
- 📋 SHA-1 — компромисс по скорости и надёжности, до сих пор встречается в документации к старым устройствам.
⚠️ Внимание: совпадение хеша подтверждает идентичность, но не подлинность. Если прошивка скачана из неофициального источника, сверяйте контрольную сумму только со значением, опубликованным производителем устройства, а не на том же неофициальном ресурсе.
Хеширование не заменяет полноценное сравнение, когда нужно увидеть сами отличия. Оно лишь отвечает на вопрос «одинаковые или нет», поэтому используйте его как первый фильтр перед детальным анализом.
Сравнение в Windows: команда fc и PowerShell
В Windows есть встроенный инструмент побайтового сравнения — команда fc с ключом /b (binary). Она не требует установки сторонних программ и работает в любой версии системы:
fc /b firmware_old.bin firmware_new.binУтилита выводит адреса отличающихся байтов и их значения в шестнадцатеричном виде. Для больших файлов вывод бывает громоздким, поэтому результат удобно перенаправить в текстовый файл: fc /b a.bin b.bin > diff.txt. Если файлы идентичны, команда сообщит, что различий не найдено.
Альтернатива — PowerShell с командлетом Compare-Object, который сравнивает массивы байтов. Такой подход гибче: можно отфильтровать только первые несовпадения или посчитать их общее количество. Однако для файлов большого размера загрузка обоих файлов в память целиком может быть неоптимальной — в этом случае лучше подходят специализированные утилиты, читающие данные порциями.
💡Перед сравнением проверьте размеры обоих файлов: если они различаются, fc /b всё равно сработает, но смысл результата меняется — короткий файл может быть просто обрезанной копией длинного.