Ausgabe konvertieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

hi,
hab hier folgenden Code:

Code: Alles auswählen

dumpfile=open('file.txt', 'r')
bit=dumpfile.read()
dumpfile.close()

blocks=', '.join(re.findall('.*?Freie Bl\xc3\xb6cke:\\s*([0-9, -]*)\\s*$', bit, re.I|re.M)).split(', ')
i=0
blocklen = len(blocks)
while i < blocklen:
   if not len(blocks[i].strip()):
       blocks.pop(i)
       blocklen -= 1
       continue
   if '-' in blocks[i]:
       blocks += xrange(int(blocks[i].split('-')[0], 10), int(blocks[i].split('-')[1], 10)+1)
       blocks.pop(i)
       blocklen -= 1
   else:
       blocks[i] = int(blocks[i], 10)
       i += 1

blocks.sort()
print int(blocks,16)

mit allen Blöcken möchte nun unwandeln das ascii rauskommt habs versucht mit print int(blocks,16)
Fehler:
Traceback (most recent call last):
File "testbit.py", line 38, in <module>
print int(blocks,16)
TypeError: int() can't convert non-string with explicit base

gibts noch ne Möglichkeit?
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

Was meinst du mit ASCII?
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

sry ich meinte eig bit
integer to bit converting
will die blocks als bit und dann in Datei schreiben.
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

Das?

Code: Alles auswählen

>>> a = 128
>>> bin(a)
'0b10000000'
>>> b = 0b10000000
>>> b
128
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

Beispielblock:
1264184
wenn belegt 1 wenn nicht belegt 0.
file.txt:

Freie Blöcke: 1245184-1277951

also müssten die Blöcke als 0 erscheinen.
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

Du weißt aber, dass das nichts mit deiner Frage hier zu tun hat?!?
Da musst du wohl nachschauen ob die entsprechenden Blöcken in dem Bereich sind und dann einfach eine BYTE Schreiben.
Oder willst du Bits setzen?
Du redest wirr.
Zuletzt geändert von sparrow am Freitag 30. September 2011, 08:27, insgesamt 1-mal geändert.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

öhm doch weil ich die Blöcke die Ausgabe davon als bit anzeigen muss ^^. Die Ausgabe was ich auswerf von den Blöcken wird als 0 und 1 dargestellt nicht mehr als ganze Zahlen wie bei Windows die Datei $bitmaps und die Ausgabe wird dann in ne Text-Datei geschrieben.
und wie soll ich das sonst schreiben? mit der Hand wäre nicht sinnvoll das ich jeden Block raussuche o.o
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

$ echo '10101' > text.txt
$ cat text.txt
10101
$ hexdump text.txt
0000000 3031 3031 0a31                         
0000006
Ich weiß immer noch nicht was du willst, aber spätestens wenn du etwas in eine Textdatei schreibst sind das sicherlich keine Bits mehr.

Entweder bringst du hier ganz viele Sachen durcheinander (insbesondere Bezeichnungen), oder das ist Raketenwissenschaft. Ich tippe auf ersteres.
BlackJack

@bluelagoon: Was Du da mit der `blocks` Liste verantstaltest ist ziemlich unübersichtlich und auch ineffizient wegen den `pop()`\s. Wenn Du da eine neue Liste mit den konvertierten Ergebnissen aufbauen würdest, könntest Du eine einfache ``for``-Schleife über `blocks` verwenden und die `pop()`\s, das manuelle führen von `i`, und das sortieren am Ende einsparen.

Letztlich skaliert dieser Ansatz aber überhaupt nicht. Eine Liste mit allen freien Blocknummern bei einer heutzutage normalen Partitionsgrösse sprengt locker den Speicher.

Ganz zum Schluss versuchst Du eine *Liste mit Zahlen* mit `int()` in *eine* Zahl umzuwandeln. Das kann natürlich nicht gehen.

Mir ist an der Stelle auch nicht ganz klar was Du da heraus bekommen möchtest? Ich dachte es ging ursprünglich mal um eine Datei mit einem Byte pro Block in dem entweder 0 oder 1 steht!? Das als Datenstruktur im Speicher wäre ja erst einmal auch eine Liste der gleichen Länge wie die (zu lange) Liste mit den freien Blocknummern. Selbst wenn man die Information kompakter speichert, zum Beispiel als `array`- oder `numpy`-Array, sind das immer noch ziemlich grosse Datenmengen.

Ich würde versuchen den Speicherverbrauch möglichst klein zu halten. Dazu müsstest Du Dir mal Funktionen und dort dann auch im Speziellen Generatorfunktionen anschauen. Statt die Datei komplett einzulesen und dann komplett in eine Liste mit freien Blocknummern zu überführen, wäre eine Generatorfunktion, die die freien Blocknummern liefert wesentlich speicherschonender zu implementieren. Etwas schlauer wäre es vielleicht sogar nicht jede einzelne Blocknummer zu liefern, sondern genau wie in der ``dumpe2fs``-Ausgabe Tupel mit den Bereichen von wo bis wo freie Blöcke liegen. Dann muss man nicht jeden freien Block einzeln abarbeiten.
bluelagoon
User
Beiträge: 216
Registriert: Mittwoch 25. August 2010, 12:26

problem gelöst.
Benutzeravatar
sparrow
User
Beiträge: 4530
Registriert: Freitag 17. April 2009, 10:28

Coo, wie?
Antworten