Laden...

Bytes in C#, Darstellung von int, String

Erstellt von Davaaron vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.735 Views
D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 8 Jahren
Bytes in C#, Darstellung von int, String

Hi,

Ich arbeite an einem kleinen Projekt zum Einstieg in die C# Welt und verstehe nicht so ganz, wie diese Sprache funktioniert.
Angenommen ich habe ein byte-Array, in das ich int-Werte abgespeichert habe und schreibe dessen Inhalt nun in eine Textdatei. Was ich sehe sind keine Bytes, sondern die tatsächlichen Werte. Genau so wie Strings. (Bei Verwendung eines FileWriters).
Erst bei einem BinaryWriter werden die Bytes in Bits geschrieben und ich sehe nur noch Kauderwelch, nicht zu entschlüsselnde Zeichen. (Da frage ich mich wieso. Der Computer arbeitet intuitiv nur mit Bits und kann diese nicht anzeigen? Oder liegt dies an dem Notepad?)

Wie ist das nun zu verstehen? Sind die Bytes in dem Array wirklich als Bytes abgespeichert und wandelt der FileWriter diese in lesbare Zeichen um mittels ASCII?

W
872 Beiträge seit 2005
vor 8 Jahren

Bitte sei etwas präziser mit Codebeispiel.
Wahrscheinlich hast Du ein implizites ToString() in Deinem Code mit dem TextWriter.

3.003 Beiträge seit 2006
vor 8 Jahren

a) in ein byte-Array kannst du keine int speichern. Du kannst int übergeben, da das Array nur byte speichern kann, wird int in byte gecastet (Google: boxing c#)

b) eine Textdatei hat es so an sich, dass sie Text enthählt. Zum Schreiben von Text kannst du TextWriter nehmen, die FileWriter-Klasse ist mir unbekannt. Textwriter wandelt beim Aufruf seiner Methode Write() allen Inhalt in die Zeichenrepräsentation der aktuellen Umgebung (bei dir sicher deutsch) um und schreibt diese.

TextWriter.Write(object): Writes the text representation of an object to the text string or stream by calling the ToString method on that object. TextWriter.Write

c) BinaryWriter schreibt keine Zeichenrepräsentation, sondern den puren binären Wert, deshalb heisst er so. Die entstehende Datei enthält genau die bytes deines Byte-Arrays.

d) "mittels ASCII" wird nirgends etwas umgewandelt. Der Ausdruck deutet auch auf einen Nachholbedarf in Sachen Text und Encoding bei dir hin, also auch da noch einmal Google oder besser noch ein Buch bemühen.

Entschuldige, wenn das etwas harsch klingt, aber das sind Grundlagen, die in vielen Büchern auf den ersten Seiten erklärt werden., und wir können das, was ein Buch dir beibringen kann, hier im Forum nicht leisten. Dafür ist es auch weniger da.

LaTino

oh, und e) Notepad zeigt jede Datei als Text an. Für das Betrachten einer Binärdatei nimmt man üblicherweise einen Betrachter für binäre Dateien. Total Commander hat das eingebaut, es gibt sicherlich noch etliche Alternativen.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 8 Jahren

Ok ok, aller Anfang ist schwer 😉

Also dann hole ich mal etwas weiter aus.
Ich habe ein Bild, welches geladen und in eine PictureBox geschrieben wird. Dann berechne ich den grauwert dieses Bildes und stelle dieses in einer anderen PictureBox dar.
Nun sollen die Informationen dieses Bildes auf der Festplatte gespeichert werden, so wie die Höhe und Breite des Bildes. Man kann jetzt diese Datei laden und aus diesen Dateien wird wieder das ursprüngliche Grauwert-Bild erstellt und angezeigt in einer PictureBox.
Das Schreiben mit einem BinaryWriter habe ich nun selbständig hinbekommen, in dem ich zuerst

writer.write("Height"+height);
writer.write("Width"+width); 
File.WriteAllBytes(filename, bArr);

geschrieben habe. Mein Problem besteht jetzt eigentlich viel mehr darin, die Höhe und Breite auszulesen.
Der BinaryReader der LINQ Version hat viele tolle Methoden wie Seek, Skip und To, so könnte ich gezielt die Höhe und Breite auslesen, wenn icb wüsste wie viele Bytes so eine Zahl hat (denn die Zahl variiert je nach Bild sehr stark)
Es wäre besser einfach die Zahl zwischen dem String Height und Width auszulesen und dann die Zahl nach Width und den Rest mit File.readAllBytes(); zu lesen.
Aber wie bewerkstellige ich das?

3.003 Beiträge seit 2006
vor 8 Jahren

Der BinaryReader der LINQ Version hat viele tolle Methoden wie Seek, Skip und To, so könnte ich gezielt die Höhe und Breite auslesen, wenn icb wüsste wie viele Bytes so eine Zahl hat (denn die Zahl variiert je nach Bild sehr stark)

Das kannst du mit einem Hex-Betrachter selbst herausfinden. Hier hast du eine Auswahl.

Im Normalfall wäre die Antwort:
byte: 1 byte
char: 2 byte
short (= Int16): 2 byte
int (= Int32): 4 Byte
long (= Int64): 8 byte
float: 4 Byte
double: 8 Byte
decimal: 16 Byte
(vgl. MSDN: Werttypen)

Allerdings klingt deine Formulierung so, als würdest du auch die Zeichenketten "height" und "width" speichern. Das macht in Binärdateien nicht viel Sinn (dort arbeitet man im Allgemeinen mit nach festen Regel vergebenen Indizes, so dass man beim Lesen weiss, wo was steht). Pro Zeichen nochmal ein char veranschlagen. Wenn man davon ausgeht, dass du die Dimensionen in Int32 speicherst, sollte das Bild also ab Index 30 zu finden sein.

Edit: ich sehe gerade, erst arbeitest du mit einem Writer, dann mit File.WriteAllBytes. Du solltest dich schon für eine Variante entscheiden.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 8 Jahren

Ja genau, die Strings Height und Width stehen am Anfang der Datei. Dachte ich könnte dann so etwas anwenden wie File...Seek("Height");

Danke für die Liste. Die ist wirklich sehr hilfreich für mich. Also die Strings Height und Width werden in Char umgewandelt. Das ist gut zu wissen.

Den Hex-Rechner gucke ich mir heute Abend mal an, bin gerade unterwegs und gleich auf der Arbeit.

Da ich die Strings Height und Width sowie deren Integer-Werte nicht in das Byte Array schrieb, wollte ich diese getrennt in die Datei schreiben. Da der BinaryWriter dies ja automatisch konvertiert, dachte ich, muss ich keine eigene StringToByte und IntToByte Methode schreiben.
Zwar hätte ich weiter den BinaryWriter in einer Schleife verwenden können um den Rest zu schreiben, aber der Einzeiler gefiel mir dann doch besser.
Da ich den BinaryWriter vorher schließe, dürfte es keine Probleme geben, oder?
Wieso sollte man sich auf einen Writer/Reader beschränken?

3.003 Beiträge seit 2006
vor 8 Jahren

Also die Strings Height und Width werden in Char umgewandelt. Das ist gut zu wissen.

Nein, nein, nein! String sind (mehr oder weniger) ein Array von Char. Das ist auch in C so (bzw, da haben wir erst gar kein string). BITTE, BITTE führ dir erst die Grundlagen mittels Buch zu Gemüte.

Und File.WriteAllBytes überschreibt die Datei, das steht so auch in der Dokumentation. Da ist piepegal, ob du die Datei vorher schließt oder auf den Mond schießt.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 8 Jahren

Im mehr oder weniger übertragenen Sinne meinte ich das auch so, nur falsch formuliert.
Dass ein String nicht auf ein Char abgebildet werden kann, ist mir bewusst.
Die Grundlagen einer anderen Sprache, die ähnlich zu C# ist, auch von der Syntax, kenne ich schon. Daher überspringe ich das mal schlicht, weil ich auch C# nur für dieses Projekt brauche.

Ok, das macht Sinn. Dann werde ich mir doch Converter-Methoden schreiben. Theoretisch ist es ja egal, ob die Daten nun aus dem File oder aus dem Array ziehe und auf den Variablen zuweise.

Danke für dein akribisches Auge und deine Hilfe

Mit freundlichen Grüßen

2.298 Beiträge seit 2010
vor 8 Jahren

Hallo Davaaron,

ich nehme an, bei den genannten Grundlagen die du dir zur Gemühte führen sollst, handelt es sich um Datentypen-Größen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.003 Beiträge seit 2006
vor 8 Jahren

Bevor ich in den Tisch beiße - du hast eine wirklich seltene Gabe, Halbwissen mit Vermutungen zu mischen - habe ich mal ein Snippet geschrieben.

Snippet: Daten binär speichern und laden

So wird mit hex-Daten gearbeitet, nicht mit diesem furchtbaren Gestochere.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 8 Jahren

Inflames, ja, mein Fehler 😄

LaTino, ja, wie man so munkelt sehr impulsiv. Vergiss nicht vorher einen mundschutz anzuziehen.
Ob das eine Gabe ist, weiß ich nicht. Aber ich stempele das mal als normal ab. Wenn man über Halbwissen verfügt, kann man doch Vermutungen aufstellen, denn auch jemand, der kein Wissen über ein Thema hat, kann Vermutungen (Transferwissen) aufstellen.

Und nochmals danke für deine Hilfe. Aber hier setze ich aber mal einen Cut an und gehe den weiter alleine weiter, bevor du mir noch wirklich in den Tisch beißt.

Mit freundlichen Grüßen