Arquivos binários explicados: como abrir e usar

Índice

Binary file

O que é um arquivo binário?

Um arquivo binário é um arquivo de computador diferente de um arquivo de texto. Ele pode conter dados, como um programa de computador, ou pode ser um arquivo que armazena dados para um programa usar. Em geral, é um código de máquina, compilado pela linguagem assembly.

Como abrir um arquivo binário?

Existem várias maneiras diferentes de abrir um arquivo binário. A maneira mais comum é usar o Editor Binário: C++ ou função API do Windows.

1. Editor de arquivos bin: Programa C++

Para abrir um arquivo binário com C++, você precisa usar a classe ifstream, que faz parte da biblioteca padrão do C++. Para usar esse método, primeiro você precisa incluir o arquivo de cabeçalho fstream. Em seguida, você pode abrir um arquivo binário usando a função membro ifstream::open(), passando o nome ou caminho do arquivo como parâmetro. Por exemplo:

1.1 Abrir arquivo bin

				
					/// 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 Salvando o arquivo da lixeira

				
					/// 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 Leitura do arquivo 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. Função CreateFile() da API do Windows

Outra maneira de abrir um arquivo binário é usar a função CreateFile() da API do Windows. Essa função faz parte da API do Windows, que não faz parte da biblioteca padrão do C++. No entanto, você pode usá-la em seus programas C++ incluindo o arquivo de cabeçalho Windows.h. A função CreateFile() aceita vários parâmetros, mas os mais importantes para abrir um arquivo binário são o nome ou caminho do arquivo, o acesso desejado (por exemplo, GENERIC_READ para leitura ou GENERIC_WRITE para gravação) e o modo de compartilhamento (por exemplo, FILE_SHARE_READ para permitir que outros processos leiam o arquivo enquanto o seu processo o mantém aberto). Por exemplo:

				
					#include Windows.h>

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

Erro de arquivo binário: "não é possível executar o arquivo binário, erro de formato exec"

O erro "não é possível executar o arquivo binário: erro de formato Exec" geralmente ocorre quando você tenta executar um arquivo binário que não é compatível com a arquitetura do seu sistema. Aqui está um caso para mostrar como resolver esse problema.

O seguinte é o código do programa que compilei com um compilador cruzado:

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

Compilar no PC:

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

Mensagem de erro ao executar no PC:

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

O PC atual tem arquitetura x86, e o arquivo binário recém-compilado está no formato 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
				
			

Solução para o erro de formato EXEC

Para resolver esse problema, temos algumas opções:

Executar o arquivo binário em um dispositivo baseado em ARM: Se você tiver acesso a um dispositivo baseado em ARM, poderá copiar o arquivo binário para esse dispositivo e executá-lo lá.

Compile o código para a arquitetura x86: você pode usar um compilador cruzado x86 para compilar o código para a arquitetura x86. Para fazer isso, você precisa instalar um compilador cruzado x86 no seu PC e compilar o código com ele.

Use um emulador: você pode usar um emulador como o QEMU para emular um dispositivo baseado em ARM no seu PC baseado em x86 e executar o arquivo binário no emulador.

Use uma máquina virtual: você pode usar uma máquina virtual para emular um dispositivo baseado em ARM no seu PC baseado em x86 e executar o arquivo binário na máquina virtual.

No geral, a melhor solução depende do seu caso de uso específico e dos recursos disponíveis.

Inscreva-se

Inscreva-se na nossa lista de assinantes para receber atualizações mensais do blog, notícias sobre tecnologia e estudos de caso. Nunca enviaremos spam e você pode cancelar a assinatura a qualquer momento.

Sobre o autor

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.

Precisa de ajuda?

Rolar para cima

Instant Quote