| 

.NET C# Java Javascript Exception

3
Ich suche für folgendes Problem den besten Lösungansatz.

Ziel:

  • Ein Fileheader für eine beliebige Datei soll erzeugt werden (z.B. Tiff, BMP, AVI) etc.

Vorraussetzung:

  • Die entsprechende Spezifikation lieft vor.

Mein erste Lösungsansatz:

  • Schreiben des Headers Byteweise in ein Array oder einen Stream.

Ich suche aber eine bessere Lösung. Bei dem obrigen Lösungansatz muss ich viel mit Offsets arbeiten die sich aber unter umständen verschieben könnten. Zudem sind Arrays ein Problem was berücksichtigt werden muss wenn man mit festen oder variabelen Offsets arbeitet. Zudem ist die Lösung einfach unschön.

Welchen Lösungsansatz würdet ihr verwenden um Sturcturen mit festen oder variabelen Größen entsprechende der Specification des Dateiformats zu schreiben.
06.11.2009
Floyd 14,6k 3 9
2 Antworten
3
Nachdem ich die Frage verstanden hab hier ein Vorschlag:
Baue Dir eine Basisklasse die die Rohdaten hält und leite davon Deine einzelnen 'typisierten' Klassen ab. Dort kannst Du dann mit Properties die Rohdaten direkt umwandeln oder auch setzen.
Du könntest sogar 'Zwischenklassen' schreiben die gemeinsamte Properties verwalten (Breite+Höhe für Bilder egal welchen Formats).

Beispielcode:
class FileBase
{
private List<byte> header;
private List<byte> data = new List<byte>();

public FileBase(int headerlength){ header = new List<byte>(new byte[headerlength]); }

protected void AddData(byte[] d){ data.Add(d); }
protected void AddData(string d){ data.AddRange( Encoding.Default.GetBytes(d) ); }
/* ...more overloads... */

public void Save(BinaryWriter bw)
{
bw.Write(header.ToArray());
bw.Write(data.ToArray());
}
}

class BmpFile : FileBase
{
public FileBase():base(2){}

public int Width
{
get{ return BitConverter.ToInt32(header,0); }
set
{
header.RemoveRange(0,2);
header.InsertRange(0,BitConverter.GetBytes(value));
}
}
}
09.11.2009
DaSpors 4,2k 2 8
Das sieht interessant aus. Ich werd es die tage mal ausporbieren. Danke.
Floyd 09.11.2009
Und? Hat es geholfen?
DaSpors 13.11.2009
2
Frage: WARUM?
.NET bietet mit der Image Klasse genug Möglichkeiten der Bildver-/bearbeitung und kann auch Laden und Speichern.

Wenn es denn nicht anders geht: Eine Klasse um alle benötigten Daten zu halten und der eine Methode Save() spendieren, die alle Daten sichert.
Aber: Du wirst nicht um die Einhaltung des Formates herumkommen, also auch nicht darum feste Offsets + Co einzuhalten.
06.11.2009
DaSpors 4,2k 2 8
DaSpors 4,2k 2 8
"Ein Fileheader für eine beliebige Datei soll erzeugt werden (z.B. Tiff, BMP, AVI) etc"
Die Betonung liegt auf "beliebig".. die Image-Klasse von .Net kann keine Avis, DTAUS oder Propitäre Dateiformat-Strukturen erzeugen oder?
In C++ würde ich keine Offsets brauchen da ich einfach eine passende Struktur erzeuge und diese Speichere. Ganz so einfach ist es zwar nicht, da auch hier Arrays mittleres Problem darstellen, ich such aber nach einer Lösung in C#.
Floyd 07.11.2009
Vorstellen könnt ich mir sowas:

Structure DTB_header{
[Fieldlength(12),Index(1)]
string Feld1_Länge12Byte_1tesFeld;

[Fieldlength(4),Index(2)]
string Feld2_Länge4Byte_2tesFeld;

[Fieldlength(4),Index(3)]
int Feld2_Sigend4ByteInt_3tesFeld;

....
}
...
void WriteDTB_Header(DTB_Header header{
BinaryWrite x = new BinaryWrite(..);
x.Write(header);
}
Floyd 07.11.2009
Ah...verstehe :)
Du könntest da umgekehrt vorgehen...ich schreib nochmal eine Antwort
DaSpors 09.11.2009

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH