dempsey
Goto Top

Cplusplus Bytes schrittweise vergleichen

2 hex dateien miteinander vergleichen

Hallo Zusammen,

ich mache gerade hier ein paar Übungen. Ich habe hier 2 Dateien, die Hex werte beinhalten. Diese beiden Dateien möchte ich miteinander byte für byte vergleichen. Sobald mein Programm merkt, hier sind 2 Bytes nicht gleich, dann soll er diese Bytes protokollieren in einer Textdatei. Ich möchte dies mit Vektoren machen! und ich bitte euch, meine Entscheidung da zu berücksichtigen. Es dient mir als Lerneffekt.

- Ich überprüfe bei beiden Dateien, ob beide, die selbe Länge haben. Wenn sie grundsätzlich verschieden sind, dann soll der Vergleichvorgang direkt abbrechen.

- Ich starte mit der Überprüfung der einzelnen Bytes und er soll das so lange machen, bis er das komplette Dokument (file2) durchgegangen ist.

Leider bekomme ich hier eine Fehlermeldung. Mein Compiler bemängelt mir, dass meine Vektor fehlerhaft ist. Ich hoffe ihr könnt mit meiner Zieldefinition was anfangen.

void main()
{
  ifstream file1;
  ifstream file2;

  file1.open ("file1.txt", ifstream::binary);  
  file2.open ("file2.txt", ifstream::binary);  

  vector<uint8_t> v_f1(2);
  vector<uint8_t> v_f2(2);

  while(!file2.eof())
  {
      file1.read((char*)&v_f1, 2);
      file2.read((char*)&v_f2, 2);
  
      uint8_t arg1 = v_f1;
      uint8_t arg2 = v_f2;

      uint16_t check_length = (*(uint16_t*)(&v_f1));
      uint16_t ref_length = (*(uint16_t*)(&v_f2));

      if(check_length == ref_length)
      {
		  v_f1.resize(check_length);
		  v_f2.resize(ref_length);

		  file1.read((char*)&v_f1, f1_length);
		  file2.read((char*)&v_f2, f2_length);

		  int i;
		  int counter1 = 0;
		  int counter2 = 0;

		  fstream stream;
		  stream.open("test.txt", ios::out);  
			
	  for(i = 0; i < f2_length; i++)
	  {
	      if(v_f1[i] == v_f2[i])
	      {
			counter1++;
	      }
	      else
	      {
			  counter2++;

			  stream << setw(2) << setfill('0') << hex << (int)v_f2[i] << "   Vergleiche mit   ";  
			  stream << setw(2) << setfill('0') << hex << (int)v_f1[i] <<  "	     Falsch  " << endl;  
		  }
	  }
	  stream.close();
      }
      else
      {
		  cout << "Dateien sind grundsätzlich unterschiedlich" << endl;  
      }
  }
}

Content-ID: 192049

Url: https://administrator.de/contentid/192049

Ausgedruckt am: 08.11.2024 um 18:11 Uhr

chfr77
chfr77 10.12.2012 um 11:44:21 Uhr
Goto Top
Ich habe Deinen Code mal etwas verfeinert, damit es eher auf unterschiedlichen Systemen kompiliert. Bei mir läuft das einwandfrei durch. Probier das mal bitte aus und schreib genauer was nicht funktioniert.

#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <iomanip>

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
int main(int argc, char* argv)
{
	using namespace std;
	if (argc != 3)
		cout << "Aufruf mit " << argv << " [DATEI1] [DATEI2]" << endl;  

	ifstream file1;
	ifstream file2;

	file1.open (argv[1], ifstream::binary);
	if (!file1.good())
		cout << "Datei '" << argv[1] << "' laesst sich nicht oeffnen." << endl;  
	file2.open (argv[2], ifstream::binary);
	if (!file2.good())
		cout << "Datei '" << argv[2] << "' laesst sich nicht oeffnen." << endl;  

	file1.seekg(0, ios::end);file2.seekg(0, ios::end);
	ifstream::pos_type f1_length = file1.tellg();
	ifstream::pos_type f2_length = file2.tellg();
	file1.seekg(0); file2.seekg(0);


	vector<uint8_t> v_f1(2);
	vector<uint8_t> v_f2(2);

	while(!file2.eof())
	{
		file1.read((char*)&v_f1, 2);
		file2.read((char*)&v_f2, 2);



		uint8_t arg1 = v_f1;
		uint8_t arg2 = v_f2;

		uint16_t check_length = (*(uint16_t*)(&v_f1));
		uint16_t ref_length = (*(uint16_t*)(&v_f2));

		if(check_length == ref_length)
		{
			v_f1.resize(check_length);
			v_f2.resize(ref_length);

			file1.read((char*)&v_f1, f1_length);
			file2.read((char*)&v_f2, f2_length);

			int i;
			int counter1 = 0;
			int counter2 = 0;

			fstream stream;
			stream.open("test.txt", ios::out);  

			for(i = 0; i < f2_length; i++)
			{
				if(v_f1[i] == v_f2[i])
				{
					counter1++;
				}
				else
				{
					counter2++;

					stream << setw(2) << setfill('0') << hex << (int)v_f2[i] << "   Vergleiche mit   ";  
					stream << setw(2) << setfill('0') << hex << (int)v_f1[i] <<  "	     Falsch  " << endl;  
				}
			}
			stream.close();
		}
		else
		{
			cout << "Dateien sind grundsätzlich unterschiedlich" << endl;  
			return 2;
		}
	}
	return 0;
}