ubuntuusers.de

Konvertierung Binary 2 ASCII Text

Status: Gelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

salzkraftwerk

Avatar von 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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/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:

1
2
3
4
5
./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

Avatar von 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)
Avatar von salzkraftwerk

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)
Avatar von salzkraftwerk

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

Avatar von 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 Team-Icon

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 Team-Icon

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)
Avatar von salzkraftwerk

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

Avatar von 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

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17618

Wohnort: Berlin

Mit Glück verrät auch

1
file DATEI

welcher Dateityp es ist - sagen wir proxelpraxel, und mit

1
apropos proxelpraxel

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.

Antworten |