我被难住了,需要一些帮助。在我的一个程序中,我正在实现一些代码,这样我就可以在Windows上执行一个程序,并基本上执行hexdump(你在十六进制编辑器中看到的),在那里我将其转换为二进制文件,并将其写入.txt文档。我最近才弄明白一半。代码的另一半是将一个在.txt文件中转储为二进制文件的对象重新构建到原始对象中。这通常适用于所有对象,而不仅仅是重建某个特定对象。
倾销部分的部分代码:
//Rip Program to Binary
streampos size; //Declare size variable
unsigned char* memblock; //Holds input
ifstream input; //Declare ifstream
ofstream output("output.txt", ios::out|ios::binary); //Specify ofstream
input.open("sparktools.bin", ios::in|ios::binary|ios::ate); //Open input file and move to the end of it
size = input.tellg(); //Store current location as file length
memblock = new unsigned char [size]; //Declare the input holder with array size as length of file
input.seekg (0, ios::beg); //Return to beginning of file
input.read((char*)memblock, size); //Read each character of the input file until end of file
for (int i=0; i<size; i++) //For each character until end of file:
{
std::bitset<sizeof(char) * CHAR_BIT> binary(memblock[i]); //Set bitset<1> to essentially convert to a binary char array
output << binary; //Output from binary variable created
}
input.close();
output.close();
delete[] memblock;
重建部分的部分代码:
//Restore Ripped Binary To Program
int size; //Holds length of input document
unsigned char* memblock; //Holds input
ifstream input; //Declare ifstream
ofstream output("Binary.bin", ios::out|ios::binary); //Specify ofstream
input.open("Binary.txt", ios::in|ios::binary|ios::ate); //Open input file and move to the end of it
size = input.tellg(); //Store current location as file length
input.seekg(0, ios::beg); //Return to beginning of file
memblock = new unsigned char [size]; //Declare the input holder with array size as length of file
input.read((char*)memblock, size); //Read each character of the input file until end of file
for (int i=0; i<size; i++) //For each character until end of file:
{
output.write((char*) &memblock[i], size); //Write each char from the input array one at a time until end of file to the output binary
}
input.close();
output.close();
delete[] memblock;
我正在图像上测试功能。原始文件大小为10 KB。转储时,.txt文件为76KB,内容与十六进制编辑器中显示的内容相匹配。
当我从二进制转储重建时,文件大小不会回到10 KB。当我增加位集编号时,文件大小会增加。然而,在比特集<1> 它保持在76KB。从我的结论来看,我本质上需要比特集<0.125>将文件大小从76KB减少到10KB,并且数字应该匹配,可以简单地将其从.bin重命名为.bin,无论它最初是什么,都可以正常工作。然而,我认为比特集不会低于1。
我尝试过的代码:
43555 KB: output.write((char*)&memblock[i], size);
0 KB: output.write((char*)memblock[i], size);
43555 KB: output.write((const char*)&memblock[i], size);
43555 KB: output.write(reinterpret_cast<const char*>(&memblock[i]), size);
43555 KB: output.write(reinterpret_cast<char*>(&memblock[i]), size);
76 KB: output << memblock[i];
当我做这些简单的检查时:
cout << memblock[i];
cout << size;
我看到所有的输入都已读入,并且与文件中的内容完全相同。大小变量在77296处是正确的。
通过做一些猜测,我认为我需要对比特集做一些事情,或者手动将比特转换回字节,转换,然后传递该值来实现这一点。我是走在正确的道路上,还是有更好/更容易的方法/我的代码出错了?提前感谢您的帮助!
据我所知,问题在于位集转储中的位顺序,即第一段代码的磁盘转储:
11001010
意味着第一个比特是字节中最重要的,所以要解码它,你应该在循环中做这样的事情(测试):
unsigned char *p = memblock;
//For each character until end of file:
for (int i=0; i<size/8; i++)
{
uint8_t byte = 0;
for (int j = 7; j >= 0; j--)
if (*p++ == '1')
byte |= (1 << j);
output.write((char*) &byte, 1);
}
请注意,您循环大小/8,因为每8个字符编码一个字节,并且内部循环从7迭代到0以反映第一个比特更重要的事实。