char array

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
miller_m
User
Beiträge: 4
Registriert: Dienstag 29. März 2005, 15:56

Dienstag 29. März 2005, 16:14

hallo zusammen,

bin neu was python angeht. ich wollte einen exporter für blender
schreiben. da mein file format (binär) natürlich schon existiert muss ich
was äquivalentes zu c bzw c++ finden.

1.) ich speichere datei namen usw in einem char array (c)

Code: Alles auswählen

char	szFile[32];
das heisst ja nichts anderes das ich 32 bytes in eine datei schreibe mit
einem nullterminierten string als inhalt. wie löse ich das in python?

2.) gibt es sowas wie einen sizeof operator in python? da das file format
chunk basierend ist hab ich immer die grösse der klasse * anzahl genommen und wusste wieviel bytes ich schreiben musste.

Code: Alles auswählen

// bsp c++
// ctor mit chunkname und chunkgrösse
Chunk chkVertices("Vertices", sizeof(Vector4f) * nNumVertices);
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 29. März 2005, 16:23

miller_m hat geschrieben:das heisst ja nichts anderes das ich 32 bytes in eine datei schreibe mit einem nullterminierten string als inhalt. wie löse ich das in python?
Meinst du sowas:

Code: Alles auswählen

f = file( "meinedatei.dat", "wb" )
f.write( "\x00" * 32 )
f.close()
miller_m hat geschrieben:gibt es sowas wie einen sizeof operator in python?

Code: Alles auswählen

len(Vector4f) * nNumVertices

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
miller_m
User
Beiträge: 4
Registriert: Dienstag 29. März 2005, 15:56

Dienstag 29. März 2005, 16:41

jens hat geschrieben:

Code: Alles auswählen

f = file( "meinedatei.dat", "wb" )
f.write( "\x00" * 32 )
f.close()
so wie das für mich aussieht schreibst du 32 bytes null
wenn ich zb sowas bräuchte (0 == nullzeichen)
teststring\n00000000000000
und die ganze geschichte gesamt 32bytes lang.
miller_m hat geschrieben:gibt es sowas wie einen sizeof operator in python?

Code: Alles auswählen

len(Vector4f) * nNumVertices
sieht gut, allerdings wie kann ich die grösse der member, beim schreiben ins file oder prinzibel, garantieren (hab die deklationen von python noch nicht ganz begriffen)
bsp:
Vector4f sollte vier member vom typ float besitzen somit müsste mir
len() 4 * 4 byte zurückgeben
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 29. März 2005, 16:49

Ich kenne mich mit Binär-Dateien zu wenig aus... Du solltest dir vielleicht mal das Modul struct ansehen:
http://www.python.org/doc/lib/module-struct.html

Um immer eine 32Byte länge zu erreichen könnte man eine einfache Funktion schreiben:

Code: Alles auswählen

def jo( txt, bytes = 32 ):
    txt += "\n"
    return txt + "\x00" * ( bytes - len(txt) )

test = jo("jup")
print "XXX%sXXX" % test
print len(test)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
miller_m
User
Beiträge: 4
Registriert: Dienstag 29. März 2005, 15:56

Dienstag 29. März 2005, 16:56

die funktion sieht gut, danke dir. link werde ich mir mal anschauen.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 29. März 2005, 17:05

Mit struct geht's so:

Code: Alles auswählen

import struct
txt = "jup"
test = struct.pack('32s', txt + "\n" )

print "XXX%sXXX" % test
print len( test )

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
miller_m
User
Beiträge: 4
Registriert: Dienstag 29. März 2005, 15:56

Dienstag 29. März 2005, 17:30

struct find ich besser hab es so gelösst. nullterminierung ist dann unnötig bzw. hat sowieso nicht hingehaut.
Antworten