struct

Status
Nicht offen für weitere Antworten.
V

Valodim

Gast
Moin :)

Ich haette da ein Problem, und keine Ahnung wie ich da rangehen muesste....

ich habe eine Datei, ovn der die Struktur bekannt ist:

/*--| SFF file structure
|--------------------------------------------------*\
Version 1.01
HEADER (512 bytes)
------
Bytes
00-11 "ElecbyteSpr\0" signature [12]
12-15 1 verhi, 1 verlo, 1 verlo2, 1 verlo3 [04]
16-19 Number of groups [04]
20-24 Number of images [04]
24-27 File offset where first subfile is located [04]
28-31 Size of subheader in bytes [04]
32 Palette type (1=SPRPALTYPE_SHARED or 0=SPRPALTYPE_INDIV) [01]
33-35 Blank; set to zero [03]
36-511 Blank; can be used for comments [476]

SUBFILEHEADER (32 bytes)
-------
Bytes
00-03 File offset where next subfile in the "linked list" is [04]
located. Null if last subfile

04-07 Subfile length (not including header) [04]
Length is 0 if it is a linked sprite
08-09 Image axis X coordinate [02]
10-11 Image axis Y coordinate [02]
12-13 Group number [02]
14-15 Image number (in the group) [02]
16-17 Index of previous copy of sprite (linked sprites only) [02]
This is the actual
18 True if palette is same as previous image [01]
19-31 Blank; can be used for comments [14]
32- PCX graphic data. If palette data is available, it is the last
768 bytes.
\*--------------------------------------------------------------------------*/

ich suche nach einem Weg, die Information aus den Dateien zu extrahieren, das Problem ist nun, dass es in java schlecht aussieht mit struct. Jemand ne Idee wie ich das moeglichst simpel hinkriegen kann? oder kann ich gar einfach eine klasse definieren mit den entsprechenden variablen und das passt? ich schaetze mal dass das nicht einfach so uebernommen werden kann :|
 
V

Valodim

Gast
Hmmm, wie ich das so kriege is mir schon klar aber in C wuerde ich einfach die struct definieren und das auslesen...

naja geht wohl nich anders... tortzdem danke :)
 
B

bygones

Gast
natürlich kannst du dir einfach eine Klasse definieren.. *kopfkratz*
 

0xdeadbeef

Top Contributor
Nee, mit 'ner Klasse geht das nicht ohne weiteres. Ein (packed) Struct repräsentiert 1:1 eine Speicherstruktur, in diesem Fall ein File. Noch nützlicher für IO-Strukturen in Mikrokontrollern etc. Bei einer Klasse gibt es keine zugesicherte Anordung im Speicher, ergo ist sie für derlei Zwecke nutzlos.
 
V

Valodim

Gast
mir faellt grad auf dass ich extrem merkwuerdig schreibe heute o_O

naja wie auch immer... in C wuerde ich ne struct definieren und die einfach in die Datei schreiben (bzw auslesen), s.o.

Ok ich lese das jetzt einfach nach und nach aus und verarbeite es, das ist zwar unstaendlich aber es geht :)

Aktuelles Problem:
Bei Addresse 16 zeigt er im hexeditor einen hex-wert von 9C, also dezimal 166 an. wenn ich mit java die datei einlese und den Wert dieser Addresse ausgeben lasse, sagt er -100. ne idee?
 
V

Valodim

Gast
foobar hat gesagt.:
Was genau mußt du bei einem struct definieren? Und was kann man dann damit machen?

ein struct ist quasi eine klasse ohne methoden. ;)

verdammt ich muss mich reggen, is ja schrecklich wenn man seine Beitraege nich editierne kann >_>
 

Illuvatar

Top Contributor
Registrieren ist immer gut ;)

Also, in C# ist ein Struct sehr einfach gesagt eine Klasse auf dem Stack.

Und ich denke in Java musst du das eben byteweise auslesen, das wird nicht anders gehen.
 

Bleiglanz

Gesperrter Benutzer
Bei Addresse 16 zeigt er im hexeditor einen hex-wert von 9C, also dezimal 166 an. wenn ich mit java die datei einlese und den Wert dieser Addresse ausgeben lasse, sagt er -100. ne idee?
in java sind bytes vorzeichenbehaftet!!!
 

dotlens

Top Contributor
0xdeadbeef hat gesagt.:
Nee, sind sie nicht. Eventuell eine Konvertierung bei der Ausgabe.
doch byte ist in java vorzeichen behafted. alleine diese konstanten sollten das beweisen:

static byte MAX_VALUE
A constant holding the maximum value a byte can have, 27-1.
static byte MIN_VALUE
A constant holding the minimum value a byte can have, -27..

EDIT:
byte ist in java 16 bit gross wenn ich mich nicht täusche:

Galileo hat gesagt.:
Java-Typ: byte
Nativer Typ: jbyte
Beschreibung: 8 Bit mit Vorzeichen
 

Bleiglanz

Gesperrter Benutzer
zur Klarstellung:

für die Sprache Java sind bytes (d.h. der primitive Typ byte) vorzeichenbehaftet - d.h. Ein- und Ausgabe als String, mathemetische Berechnungen etc. werden mit Vorzeichen durchgeführt

aber
-----
man kann byte's genausogut als 8-bit Speichereinheit verwenden, das ist überhaupt kein Problem (java.io.* macht das oft und gerne), man muss halt nur Aufpassen, dass man keine "falschen" Berechnungen durchführt
 

meez

Top Contributor
Bytes sind in Java 8 bit...Und nicht 16...
IO verwendet bytes halt so wie sie dastehen, ohne jede interpretation, d.h. eine führende 1 wird als 1 angesehen, und nicht als vorzeichen behaftete Zahl...Bleiglanz hat vollkommen recht...
 
B

Beni

Gast
Als ich das letzte mal mit C-binär-Dateien arbeitete, waren auch noch die Reihenfolge der Bytes z.B. in einem Integer verkehrt herum... ich hab da "DataInputStream" genommen, und alles "verkehrt herum" abgeschrieben, das funktionierte dann ganz gut :wink:
 

Valodim

Mitglied
sobald im Hexwert nen Buchstabe vorkommt kommt da alles raus, ausser dem was rauskommen sollte. umdrehen geht aber auch nur bei Werten in denen kein Buchstabe vorkommt... :(
 

Bleiglanz

Gesperrter Benutzer
überleg erst mal, ob dein Dateiformat ein Textformat ist (was soll das mit den Hex-Werten und Buchtaben sonst bedeuten???), oder ob die Daten binär (1 byte = 8 Bits) drinstehen

wenn da steht "123" (3 zeichen) dann ist das ja alles ganz anders als wenn 123 (1 byte) drinsteht, schon klar?

wenn 16 Bit Werte drin vorkommen [ein "Wort"] und die Datei nicht mit Java erzeugt wurde, dann kann ein readInt von Java natürlich in die Hose gehen (bigEndian/littleEndian Problem, kannst du aber leicht bereinigen)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben