Dateien hexadezimal schreiben

simp

Grünschnabel
Ich habe einen System::String^ mit hexadezimalen Daten eines Bildes und möchte diesen in eine Datei hexadezimal schreiben, so dass am Ende wieder ein benutzbares Bild dabei herauskommt.
Da ich an meinem ersten und vermutlich auch einzigem Projekt sitze, schaue ich doch eher verzweifelt in die Röhre. Ich bekomme zwar hin eine Datei aus diesen Daten zu erstellen, aber das ist dann nur eine Textdatei wo die eigentlichen hexadezimalen Daten drin stehen.

Was muss ich tun um diesen String mit dem Inhalt
424d46270000 ... ... 611461146118811c ... ... ...
in eine Datei zu bekommen die dann auch wirklich diese Daten in hexadezimaler Betrachtung enthält, also:
42 4D 46 27 00 00 ... ... 61 14 61 14 61 18 81 1C ... ....
 

vfl_freak

Premium-User
Moin,

und Willkommen bei Tutorials.de!

Im Prinzip kannst Du die Datei einfach BINÄR schreiben!
Also einen binären Filehandle definieren und füllen!

Poste mal Deinen bisherigen Code (bitte mit CODE-Tags; der '#'-Button)! Wichtig wäre auch zu wissen, ob Du in C oder C++ unterwegs bist!

Gruß
Klaus
 

simp

Grünschnabel
Code:
	String^ to_change = "6114|6118|811c|821c|a220|a224";
	String^ to_this = "";
	String^ pix_file = "C:\\source.bmp";
	int counter = 0;
	String^ modified = "";

	FileStream fs( pix_file, FileMode::Open );
	BinaryReader br( %fs );

	for ( __int64 i = 0, i_max = fs.Length; i < i_max; ++i )
	{
		unsigned char byte = br.ReadByte();
		to_this += byte.ToString( L"x2" );
		counter++;

		if ( counter == 2 )
		{
			if ( to_change->Contains( to_this ) )
			{
				to_this = "ffff";
			}
			modified += to_this;
			to_this = "";
			counter = 0;
		}
	}

	br.Close();
	fs.Close();

	if ( File::Exists( "C:\\dest.bmp" ) )
	{
		File::Delete( "C:\\dest.bmp" );
	}


Soviel zum bisherigen Stand ... das Ergebnis in "modified" muss jetzt wieder in eine Datei und diese sollte wieder ein Bild ergeben.
Am einfachsten wäre wohl, die hexdaten wieder zu schreiben ...

Achso: CPP ...
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

mal dumm gefragt: bist Du sicher, dass Du hier bei "VisualStudio/MFC" richtig bist? ? ? :confused:

Irgendwie ist "String^" nicht wirklich C++, dort sollte es eigentlich "string *" heissen ......

Wo genau ist denn nun Dein Problem?
Gibt es keinen BinaryWriter, mit dem Du Dein "modified" schreiben kannst ? ? ?

Gruß
Klaus
 

MCoder

Erfahrenes Mitglied
mal dumm gefragt: bist Du sicher, dass Du hier bei "VisualStudio/MFC" richtig bist? ? ? :confused:
Ich denke auch, dass .NET-Forum passt besser.

Hallo simp,
du musst den String wieder in ein Byte-Array konvertieren und kannst die Daten dann mit BinaryWriter wegschreiben:
C++:
String ^str = "424d46270000";

// Umwandeln in ein Byte-Array

int nSize = str->Length / 2;
array<Byte> ^aBuffer = gcnew array<Byte>(nSize);

for( int i = 0; i < nSize; i++ )
{
    aBuffer[i] = Convert::ToByte(str->Substring(i * 2, 2), 16);
}

// Schreiben in Datei

BinaryWriter^ oWriter = gcnew BinaryWriter(File::Open("C:\\Temp\\Test.bin", FileMode::Create));
oWriter->Write(aBuffer);
oWriter->Close();
Evt. solltest du mal überlegen, wie du ohne die Hin- und Herwandlung in Strings auskommen kannst, da du ja ohnehin nur die Binärdaten bearbeitest.

Gruß
MCoder
 

simp

Grünschnabel
Nein ... natürlich bin ich nicht sicher ob ich im richtigen Forum bin ;). Ist wie gesagt mein erstes und vermutlich auch einziges Projekt bisher. Das bisschen was ich über Programmierung weiss kommt aus HTML und ne handvoll PHP.
Wollte mir nur mal ne Kleinigkeit basteln :)

Das hier ist letztendlich der Code der das erhoffte Ergebnis bringt:

Code:
 	int nSize = modified->Length / 2;
	array<Byte> ^aBuffer = gcnew array<Byte>( nSize );
 
	for( int i = 0; i < nSize; i++ )
	{
	    aBuffer[i] = Convert::ToByte( modified->Substring( i * 2, 2 ), 16 );
	}
 
	FileStream ws( "C:\\dest.bmp", FileMode::Create );
	BinaryWriter wr( %ws );
	wr.Write( aBuffer );
	wr.Close();
	ws.Close();

Wie man sieht noch ein klein wenig verändert. Aber wo wir gerade dabei sind, könnt ihr mir sagen worin die Unterschiede der verschiedenen Sprachen liegen, bzw. woran ich sie erkenne ? Am besten wäre natürlich ein Link zum selber nachlesen :)

Ansonsten danke für Eure Hilfe, klappt wunderbar.