BinärCode in Memofeld darstellen (HexToBin?)
-
mrsample schrieb:
Ja im Prinzip ist es das was ich meine. Dein Code bringt bei mir allerdings folgende Fehlermeldung in der letzen Zeile:
Der Code funktioniert im C++ Builder XE2, da ist das Beispiel herkopiert.
mrsample schrieb:
Ich benutze übrigens den C++ BBuilder 6.
Das solltest Du bei deinen Fragen erwähnen. Das Teil ist immerhin über 10 Jahre alt.
HexToBin habe ich noch nie benutzt. Was sagt den der Debugger, wenn du da beim Aufruf von HexToBin einen Breakpoint setzt ? Wie sieht der Inhalt von buffer nach dem Funktionsaufruf aus ?
-
Das sieht doch schon mal nicht ganz falsch aus
Zeile 14:
Die Zeile fügt am Ende des Textes einen Zeilenumbruch ein. Ist das so gewollt oder soll nach einer bestimmten Anzahl von Hex-Zahlen ein Zeilenumbruch eingefügt werden. Falls nur am Ende des Textes ein Zeilenumbruch anhängen willst kannst du das auch einfach hinter der Schleife machen und brauchst nicht in der Schleife zu prüfen.Zeile 15:
Was passiert hier?
Laut Doku liest sich das so, dassBinToHex
einen Speicherbereich hexadezimal in einem String ablegt undHexToBin
das Ganze rückwärts macht.Du musst dir wohl selbst eine Funktion schreiben, die einen
char
erwartet und einen AnsiString mit der Binärdarstellung des char zurückgibt.
-
mrsample schrieb:
Ja im Prinzip ist es das was ich meine. Dein Code bringt bei mir allerdings folgende Fehlermeldung in der letzen Zeile:
[/code]
// Das hier ?
Memo1->Lines->Append(v[0].to_string().c_str());
[code="cpp"]
E2316:'c_str' is not member of 'basic_string<_CharT,_Traits,_Alloc>'Scheint so als ob hier ein #include <string> fehlt.
-
[quote="Braunstein"]
mrsample schrieb:
Scheint so als ob hier ein #include <string> fehlt.
Könnte sein, im XE2 included bitset aber string. Auch in VC++ ist das so, macht ja auch Sinn, weil bitset auch Konstruktoren mit Stringparametern hat.
Keine Ahnung, wie das im BCB6 ist und ob die alte Standardbibliothek das alles schon vollständig implementiert.
-
Habe die string.h mal mit eingebunden...es kommt die gleiche Fehlermeldung.
Zur Zeit steht im buffer beim Aufruf nur das letzte Zeichen des Dateiinhaltes (in Hex)...eigentlich sollte ja alles aus str drinnen stehen. Geht aber irgendwie nicht. Sobald ich den kompletten AnsiString beschreiben möchte
str_a[n] = IntToHex((unsigned char) str[n],2);
bekomme ich die Fehlermeldung: 'Cannot convert 'AnsiString' to 'Char'.
Das mit Zeile 14. war ein guter Hinweis...danke.
Und das mit der eigenen Funktion ist da wohl eine Nummer zu groß für mich. Ich dachte eigentlich, dass es nicht so ungewöhnlich ist ein Zeichen in Binärdarstellung in einem Memo darzustellen und bin davon ausgegangen, das dies HexToBin möglich macht.
-
@Alle
Vielen Dank für eure Denkanstöße...
, ich habe es nun doch lösen können, mit folgendem Code:
void __fastcall TForm1::Button3Click(TObject *Sender) { string bits; AnsiString ansibits; char buff[8]; //entsprechend ändern!! ifstream infile("test.dat", ios::binary); while(!infile.eof()) { infile.getline(buff, sizeof(buff)); } vector < bitset<8> > b; for (int i=0; i<sizeof(buff); i++) b.push_back(buff[i]); for (int i=0; i<b.size(); i++) { bits=b[i].to_string<char,char_traits<char>,allocator<char> >(); ansibits = bits.c_str(); Memo2->Lines->Append(ansibits); } }
Bis zum nächsten Beitrag
Danke
-
Das ist keine korrekte Lösung. Du liest per
getline
Daten in einen 8 Byte großen Puffer, bis das Dateiende erreicht ist. Anschließend wandelst du den Pufferinhalt in einen Binärstring um.
Was passiert, wenn eine Zeile länger als 8 Zeichen ist? Du liest zeilenweise Daten ein und behandelst die eingelesenen Daten erst dann, wenn das Dateiende erreicht ist. D.h., du behandelst nur die Daten der letzten Zeile, aber was ist mit allen anderen Zeilen? Außerdem gehtst du davon aus, dass jede Zeile genau 8 Zeichen lang ist, was passiert denn, wenn sie nur 5 Zeichen lang ist?
-
Hmm, das stimmt sicher, was du da schreibst. Jedoch ist es so - zumindest für meine Anwendung -, dass die Dateigrösse sich nie ändert uns die Struktur auch nicht. Lediglich der Inhalt der einzelnern Positionen ändert sich. Deshalb habe ich auch die Größe des Puffers so festgelegt, da ich weiß was mich erwartet. Ich bin natürlich für einen besseren Code deinerseits offen. Wie würdest Du ihn denn gestalten?
-
mrsample schrieb:
Wie würdest Du ihn denn gestalten?
Clever, so lässt du mich arbeiten, statt selbst den Code zu verbessern
#include <iostream> #include <fstream> #include <sstream> #include <vector> using namespace std; AnsiString file_to_binary_string( const AnsiString& FileName ) { ostringstream oss; ifstream ifs( FileName.c_str(), ios::binary ); if( ifs ) { // Dateigröße bestimmen und Vektor auf richtige Größe bringen ifs.seekg( 0, ios::end ); vector<char> FileData( ifs.tellg() ); ifs.seekg( 0, ios::beg ); // bei Dateigröße 0 erzeugt der Zugriff auf FileData[0] undefiniertes Verhalten, also muss dieser Fall ausgeschlossen werden if( !FileData.empty() ) { // kompletten Dateiinhalt in Vektor lesen ifs.read( &FileData[0], FileData.size() ); // alle Zeichen durchlaufen for( vector<char>::const_iterator it = FileData.begin(); it != FileData.end(); ++it ) { // ASCII Wert gegen einzelne Bitmaskierungen prüfen, MSB zuerst for( int i = 7; i >= 0; --i ) { if (*it & (1 << i) ) oss << "1"; else oss << "0"; } } } } return oss.str().c_str(); }
-
Nicht schlecht...habe es gerade mal ausprobiert. Aber wie ich sehe lag ich da mit meiner Vermutung ganz richtig - wie ich zuvor mal geschrieben hatte -, dass das eine Nummer zu hoch für mich wäre
. Naja danke nochmal.