查找 id 字符串,复制字节 util 00 填充序列并将其保存到文件中
Find id string, copy bytes util 00 filled sequence and save it to a file
好吧,我正在尝试提取二进制文件中的一些文件,目前我的方法是找到标识文件开头的 idString,复制字节直到找到 00 序列,然后将此结果保存在单独的文件中。
这是我当前的代码
#include <iostream>
#include <fstream>
using namespace std;
int writeFile(char * array, string name){
std::ofstream fs(name.c_str(), std::ios::out | std::ios::binary | std::ios::app);
fs.write(array, sizeof(array));
fs.close();
}
int main () {
streampos size;
char * memblock;
char * DATA;
char * NEW_FILE;
ifstream file ("DATA.BIN", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
DATA = memblock;
delete[] memblock;
int i = 0;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
string temp = "";
string t = "";
string temp1 = "";
for(i=0;i<300843008;i++){
temp = temp + DATA[i];
a = a + 1;
if(b == 0){
if(a == 4){
if(temp == "RIFF"){
b = 1;
NEW_FILE[0] = 'R';
NEW_FILE[1] = 'I';
NEW_FILE[2] = 'F';
NEW_FILE[3] = 'F';
}
a = 0;
temp == "";
}
}
if(b == 1){
NEW_FILE[i] = DATA[i];
if(DATA[i] == 00){
c = c + 1;
if(c == 32){
temp1 = "file" + c;
writeFile(NEW_FILE,temp1);
b = 0;
c = 0;
}
}
}
}
}
else cout << "error";
return 0;
}
我的问题是程序一打开就关闭,显然它在运行这一行时崩溃了"temp = temp + DATA [i];"但我不知道如何修复它...
谁能帮帮我?
~希望你能理解我的问题,我的英文很烂~
以下片段有问题:
size = file.tellg();
memblock = new char [size]; // <-- Allocation
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
DATA = memblock; // <-- Assign 2nd pointer to *same memory*
delete[] memblock; // <-- Delete memory pointed to by same pointers.
尤其是最后两行。
你分配内存:
memblock = new char [size];
然后再分配另一个指针指向同一个内存:
DATA = memblock;
然后删除内存:
delete[] memblock;
赋值操作:DATA = memblock
不复制内存。该操作使 DATA
点指向与 memblock
相同的位置。也就是说pointerDATA
和pointermemblock
指向同一个地方
您的代码删除了 DATA
指向的内存。不是什么好事。另见 "memory leak"。这是未定义的行为。另一个进程可能会写入已删除的数据,或者内存可能会被程序中的其他分配重新使用。无论哪种情况,您都不能指望数据在删除后仍然有效。
好吧,我正在尝试提取二进制文件中的一些文件,目前我的方法是找到标识文件开头的 idString,复制字节直到找到 00 序列,然后将此结果保存在单独的文件中。
这是我当前的代码
#include <iostream>
#include <fstream>
using namespace std;
int writeFile(char * array, string name){
std::ofstream fs(name.c_str(), std::ios::out | std::ios::binary | std::ios::app);
fs.write(array, sizeof(array));
fs.close();
}
int main () {
streampos size;
char * memblock;
char * DATA;
char * NEW_FILE;
ifstream file ("DATA.BIN", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
DATA = memblock;
delete[] memblock;
int i = 0;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
string temp = "";
string t = "";
string temp1 = "";
for(i=0;i<300843008;i++){
temp = temp + DATA[i];
a = a + 1;
if(b == 0){
if(a == 4){
if(temp == "RIFF"){
b = 1;
NEW_FILE[0] = 'R';
NEW_FILE[1] = 'I';
NEW_FILE[2] = 'F';
NEW_FILE[3] = 'F';
}
a = 0;
temp == "";
}
}
if(b == 1){
NEW_FILE[i] = DATA[i];
if(DATA[i] == 00){
c = c + 1;
if(c == 32){
temp1 = "file" + c;
writeFile(NEW_FILE,temp1);
b = 0;
c = 0;
}
}
}
}
}
else cout << "error";
return 0;
}
我的问题是程序一打开就关闭,显然它在运行这一行时崩溃了"temp = temp + DATA [i];"但我不知道如何修复它... 谁能帮帮我?
~希望你能理解我的问题,我的英文很烂~
以下片段有问题:
size = file.tellg();
memblock = new char [size]; // <-- Allocation
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
DATA = memblock; // <-- Assign 2nd pointer to *same memory*
delete[] memblock; // <-- Delete memory pointed to by same pointers.
尤其是最后两行。
你分配内存:
memblock = new char [size];
然后再分配另一个指针指向同一个内存:
DATA = memblock;
然后删除内存:
delete[] memblock;
赋值操作:DATA = memblock
不复制内存。该操作使 DATA
点指向与 memblock
相同的位置。也就是说pointerDATA
和pointermemblock
指向同一个地方
您的代码删除了 DATA
指向的内存。不是什么好事。另见 "memory leak"。这是未定义的行为。另一个进程可能会写入已删除的数据,或者内存可能会被程序中的其他分配重新使用。无论哪种情况,您都不能指望数据在删除后仍然有效。