salzkraftwerk
Anmeldungsdatum: 5. Juni 2010
Beiträge: 49
|
Hi Leute, das Forum und diverse andere Programmierseiten habe ich bereits bemüht. Ich habe hier ein Paar Binärdateien (vermutlich 8bit). Diese hätte ich gern in eine lesbare Textdatei (Ascii oder UTF8) umgewandelt, weil ich lesen möchte was da drin steht. Einen Hexeditor habe ich schon bemüht, der macht nicht viel Sinn. Auch wenn ich die Datei mit einem Editor oder cat anzeige steht da nur unlesbares wie £¸Ì¶ËÇááá¨kxmD. Ich habe mit python und c++ versucht der Sache Herr zu werden - Erfolglos. Ich drehe mich nur im Kreis. | #!/usr/bin/python
import sys
import os.path
fileIn = open("mprage_3T_1_ISO.vmr","rb")
fileOut = open("bin2txt_out.txt","w")
fileOut.write(fileIn)
fileOut.close()
|
Ergibt als Output im Terminal:
| ./bin2ascii.py
File "./bin2ascii.py", line 5
fileIn = open("mprage_3T_1_ISO.vmr","rb")
^
IndentationError: unexpected indent
|
In C++ Habe ich das Gerüst, aber so recht weiter komme ich da nicht.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 | #include <fstream>
#include <sstream>
using namespace std;
int main(int argc, char *argv[])
{
char * buffer;
long size;
char* inputname = argv[1];
char* outputname = argv[2];
ifstream infile (inputname,ifstream::binary);
ofstream outfile (outputname,ofstream::out);
// Get size of file.
infile.seekg(0,ifstream::end);
size=infile.tellg();
infile.seekg(0);
// Allocate memory for file content.
buffer = new char [size];
// Read content of infile.
infile.read (buffer,size);
// Operators for Bin2Text here.
// Write to outfile.
outfile.write (newbuffer,newsize);
// Cleanup.
delete[] buffer;
delete[] newbuffer;
outfile.close();
infile.close();
return 0;
}
|
|
nullEuro
Anmeldungsdatum: 26. Februar 2009
Beiträge: 225
|
Willst du strings aus einer Datei filtern? (Konsolenkommando "strings" wäre da richtig), oder einen anderen Zeichensatz oder was? Ich bin mir nicht sicher was du meinst... Wäre ja gut zu wissen was das für Dateien sind die du da öffnen willst., bzw. wie sie erzeugt werden/wo sie herkommen
|
salzkraftwerk
(Themenstarter)
Anmeldungsdatum: 5. Juni 2010
Beiträge: 49
|
Ich möchte keine Strings filtern. Die Datei beinhaltet keine. 01100001 → a
usw. Es sind Volumendaten gespeichert. Die Datei beinhaltet im ersten Teil einen Header der aussagt, welche Ausdehnungen, Wertebreich, usw. die Voxel haben. Und im zweiten Teil sind die Werte der einzelnen Voxel gespeichert. Wenn ich jetzt erkläre wo sie herkommen, dann werde ich nicht fertig. Wenn sie lesbar wäre, sollte das in etwa so aussehen, was ich ja genauer wissen und deshalb das File konvertieren möchte:
Dateiversion: 4
DimX: 128
DimY: 128
DimZ: 64
OffsetX: 0
OffsetY: 0
OffsetZ: 0
FramingCubeDim:
...
|
salzkraftwerk
(Themenstarter)
Anmeldungsdatum: 5. Juni 2010
Beiträge: 49
|
Bisheriger Code sieht so aus. Bei einigen anderen Binärdateien (an denen ich es auch getestet habe) wird auch etwas lesbares ausgegeben. Doch bei der besagten Datei steht da nur kryptisches da. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | #include <fstream>
#include <iostream>
//#include <sstream>
//using namespace std;
int main(int argc, char *argv[])
{
char* inputname = argv[1];
char* outputname = argv[2];
char ch;
std::ifstream infile;
//ofstream outfile;// (outputname, ios::out);
infile.open(inputname, std::ios::in | std::ios::binary);
//outfile.open(outputname, std::ios::out | std::ios::binary);
if(infile.is_open())
{
while(!infile.eof())
{
infile.get(ch);
std::cout << ch; // << std::endl;
}
}
//outfile.close();
infile.close();
return 0;
}
|
|
nullEuro
Anmeldungsdatum: 26. Februar 2009
Beiträge: 225
|
Naja, dein Programm tut ja im Moment nichts anderes als cat. Der Wunsch-Output den du gepostet hast sieht für mich aus als ließt ein Programm die Daten aus und erstellt dann eine Tabelle. Oder stehen so Strings wie "FramingCubeDim" wirklich in der Datei?
|
jakon
Lokalisierungsteam
Anmeldungsdatum: 16. November 2009
Beiträge: 419
|
salzkraftwerk schrieb: Ich möchte keine Strings filtern. Die Datei beinhaltet keine. 01100001 → a
usw.
Das ist doch ASCII …
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13202
|
salzkraftwerk schrieb: Ich möchte keine Strings filtern. Die Datei beinhaltet keine.
Du wärst überrascht, in wie vielen Binärdateien man jede Menge Strings finden kann. ☺
Es sind Volumendaten gespeichert. Die Datei beinhaltet im ersten Teil einen Header der aussagt, welche Ausdehnungen, Wertebreich, usw. die Voxel haben. Und im zweiten Teil sind die Werte der einzelnen Voxel gespeichert. Wenn ich jetzt erkläre wo sie herkommen, dann werde ich nicht fertig.
Wir müssten aber zumindest wissen, wie die Daten kodiert sind. Wenn ASCII-Zeichen im Klartext in der Datei stehen, ist strings in der Tat das richtige Kommando. Probiere doch einfach mal aus strings datei | less . Ansonsten handelt es sich um ein proprietäres Format, für das man ein entsprechendes Programm braucht (ggf. selber schreiben), das den Inhalt dekodiert und lesbar ausgibt. Ciao robert
|
salzkraftwerk
(Themenstarter)
Anmeldungsdatum: 5. Juni 2010
Beiträge: 49
|
Ja es ist proprietär. Und ich habe es gelöst bekommen durch rumprobieren und lesen... Hab mich da echt verwurstet angestellt. Saß heut schon den ganzen Tag davor und es ging nicht. Zum einen hatte ich einen defekten Datensatz zum anderen vergessen, dass man in Binärdateien alles nacheinader reinschreiben kann und dann mal 1, 2 oder x byte ausließt um die entsprechende Information zuzuordnen.
Jetzt muss ich das nur noch eine Textdatei exportieren, das dürfte da aber nun etwas schneller gehen. Danke für die Mühe und Ideen. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 |
#include <fstream>
#include <iostream>
int main(int argc, char *argv[])
{
char* inputname = argv[1];
char* outputname = argv[2];
unsigned short version;
unsigned short dimX;
unsigned short dimY;
unsigned short dimZ;
std::ifstream infile;
infile.open(inputname, std::ios::in | std::ios::binary);
infile.read( reinterpret_cast<char*>(&version), 2);
std::cout << "Version: " << version << std::endl;
infile.read( reinterpret_cast<char*>(&dimX), 2);
std::cout << "DimX: " << dimX << std::endl;
infile.read( reinterpret_cast<char*>(&dimY), 2);
std::cout << "DimY: " <<dimY << std::endl;
infile.read( reinterpret_cast<char*>(&dimY), 2);
std::cout << "DimZ: " << dimZ << std::endl;
float image[dimX][dimY][dimZ];
for(int z = 0; z < dimZ; z++)
{
infile.read( reinterpret_cast<char*>(&image[0][0][z]), 1);
std::cout << "Z: " << image[0][0][z] << std::endl;
}
for(int y = 0; y < dimY; y++)
{
infile.read( reinterpret_cast<char*>(&image[0][y][0]), 1);
std::cout << "y: " << image[0][y][0] << std::endl;
}
for(int x = 0; x < dimX; x++)
{
infile.read( reinterpret_cast<char*>(&image[x][0][0]), 1);
std::cout << "x: " << image[x][0][0] << std::endl;
}
std::cout << "Test: " << image[3][4][0] << std::endl;
// ... usw.
infile.close();
return 0;
}
|
|
TraumFlug
Anmeldungsdatum: 16. Juli 2009
Beiträge: 999
Wohnort: zwischen den ohren
|
Abkürzen kann man sowas gut mit Informationen z.B. von http://www.wotsit.org/. Vielleicht ist dein Format auch dabei...aber du scheinst ja schon zu wissen, wie die dateiinterne Struktur/das Dateiformat ist.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17618
Wohnort: Berlin
|
Mit Glück verrät auch
welcher Dateityp es ist - sagen wir proxelpraxel, und mit
findet man heraus, welches Programm die Datei schon lesen kann, und es gibt eines, welches die Datei in ein anderes Format konvertieren kann. Allerdings mit Glück nur - wie gesagt.
|