Объяснение бинарных файлов: как открыть и использовать

Содержание

Binary file

Что такое двоичный файл?

Двоичный файл — это компьютерный файл, который отличается от текстового файла. Он может содержать данные, например компьютерную программу, или быть файлом, в котором хранятся данные для использования программой. Как правило, это машинный код, скомпилированный на языке ассемблера.

Как открыть двоичный файл?

Существует несколько способов открытия двоичного файла. Обычно для этого используется функция Binary Editor: C++ или Windows API.

1.bin файл Редактор: программа на C++

Чтобы открыть двоичный файл с помощью C++, необходимо использовать класс ifstream, который входит в стандартную библиотеку C++. Для использования этого метода сначала необходимо включить заголовочный файл fstream. Затем можно открыть двоичный файл с помощью функции-члена ifstream::open(), передавая в качестве параметра имя или путь к файлу. Например:

1.1 Открыть файл бина

				
					/// C++ open bin file
void getBinSize(std::string path)
{
int size = 0;
std::ifstream infile(path, std::ifstream::binary);

infile.seekg(0, infile.end);
int size= infile.tellg();
infile.seekg(0, infile.beg);

infile.close();
printf("\npath=%s,size=%d \n", path, size);
return size;
}

void readBin(std::string path, char *buf, int size)
{
std::ifstream infile(path, std::ifstream::binary);

infile.read(static_cast<char *>(buf), size);
infile.close();
}
				
			

1.2 Сохранение файла корзины

				
					/// C++ save bin file
void writeBin ( std::string path , char * buf , int size )
{ std::ofstream outfile ( path , std::ifstream::binary );

outfile.write((char *)(buf), size);

outfile.close();
}
				
			

1.3 Чтение файла Bin

				
					// read binFile
std::string filePath= "./demo.bin";
int size = GetBinSize(filePath);
char *buf= new char[size];
readBin(filePath, buf, size);
float *fbuf = reinterpret_cast<float *>(buf);

// write binFile
std::string saveFilePath= "./demo_saved.bin";
writeBin(saveFilePath, buf, size);

delete buf;
				
			

2. Функция Windows API CreateFile()

Другой способ открыть двоичный файл — использовать функцию Windows API CreateFile(). Эта функция является частью Windows API, которая не входит в стандартную библиотеку C++. Однако вы можете использовать ее в своих программах на C++, включив заголовочный файл Windows.h. Функция CreateFile() принимает различные параметры, но наиболее важными для открытия двоичного файла являются имя файла или путь к нему, желаемый доступ (например, GENERIC_READ для чтения или GENERIC_WRITE для записи) и режим общего доступа (например, FILE_SHARE_READ, чтобы другие процессы могли читать файл, пока он открыт в вашем процессе). Например:

				
					#include Windows.h>

int main()
{
HANDLE file = CreateFile("example.bin", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
// ...
}
				
			

Ошибка двоичного файла: «Невозможно выполнить двоичный файл. Ошибка формата exec».

Ошибка «Невозможно выполнить двоичный файл: ошибка формата Exec» обычно возникает при попытке запустить двоичный файл, который несовместим с архитектурой вашей системы. Вот пример, показывающий, как решить такую проблему.

Ниже приведен программный код, который я скомпилировал с помощью кросс-компилятора:

				
					#include <stdio.h>
void main()
{
   printf("hello arm");
}
				
			

Сборка на ПК:

				
					# arm-linux-gnueabi-gcc -o main main.c
				
			

Сообщение об ошибке при запуске на ПК:

				
					root@ubuntu:/home/jinxin/app# ./main
bash: ./main: cannot execute binary file: Exec format error
				
			

Текущий компьютер имеет архитектуру x86, а только что скомпилированный двоичный файл имеет формат arm:

				
					root@ubuntu:/home/jinxin/app# file main
root@ubuntu:/home/jinxin/app# file main
main: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ec9b455a1c1df94060c7364d0efc42975207fca9, not stripped
				
			

Решение ошибки формата EXEC

Для решения этой проблемы у нас есть несколько вариантов:

Запустить бинарный файл на устройстве на базе ARM: если у вас есть доступ к устройству на базе ARM, вы можете скопировать бинарный файл на это устройство и запустить его там.

Кросс-компиляция кода для архитектуры x86: вы можете использовать кросс-компилятор x86 для компиляции кода для архитектуры x86. Для этого вам необходимо установить кросс-компилятор x86 на свой ПК и скомпилировать код с его помощью.

Используйте эмулятор: вы можете использовать эмулятор, такой как QEMU, для эмуляции устройства на базе ARM на вашем ПК на базе x86 и запустить двоичный файл на эмуляторе.

Используйте виртуальную машину: вы можете использовать виртуальную машину для эмуляции устройства на базе ARM на вашем ПК на базе x86 и запустить двоичный файл на виртуальной машине.

В целом, лучшее решение зависит от вашего конкретного случая использования и доступных ресурсов.

Подписаться

Присоединяйтесь к нашему списку подписчиков, чтобы получать ежемесячные обновления блога, новости о технологиях, практические примеры. Мы никогда не будем рассылать спам, и вы можете отказаться от подписки в любое время.

Об авторе

Picture of Aidan Taylor
Aidan Taylor

I am Aidan Taylor and I have over 10 years of experience in the field of PCB Reverse Engineering, PCB design and IC Unlock.

Поделиться

Рекомендуемый пост

Tags

Нужна помощь?

Прокрутить вверх

Instant Quote