Seite 1 von 2
in C# Hex-Werte zuweisen
Verfasst: Sa Jan 29, 2011 8:52 pm
von Gast-110
Mein Problem:
Code: Alles auswählen
int a = 0;
int b = 0;
a = 0x00 00 00 FF; - geht
// struct System.Int32 | stellt eine 32-Bit-Ganzzahl mit Vorzeichen da
b = a & 0xF0 00 00 00; - geht nicht :-(
// struct System.UInt32 | stellt eine vorzeichenlose 32-Bit-Ganzzahl dar
Da "int" die Länge von 4 Bytes hat und ich einfach nur spezielle Hex-Werte zuweisen will ...
Jedenfalls finde ich das rein rechnerisch nicht richtig.
Trotzdem, gibt's eine gute Lösung?
Re: in C# Hex-Werte zuweisen
Verfasst: Sa Jan 29, 2011 9:11 pm
von naums
Warum nimmst du Hexadezimalzahlen, wenn ich fragen darf? Es käme doch bestimmt besser, wenn du normale Dezimalzahlen benutzt.
MfG Naums
Re: in C# Hex-Werte zuweisen
Verfasst: Sa Jan 29, 2011 9:51 pm
von Xin
Gast-110 hat geschrieben:Mein Problem:
Code: Alles auswählen
int a = 0;
int b = 0;
a = 0x00 00 00 FF; - geht
// struct System.Int32 | stellt eine 32-Bit-Ganzzahl mit Vorzeichen da
b = a & 0xF0 00 00 00; - geht nicht :-(
// struct System.UInt32 | stellt eine vorzeichenlose 32-Bit-Ganzzahl dar
Da "int" die Länge von 4 Bytes hat und ich einfach nur spezielle Hex-Werte zuweisen will ...
Jedenfalls finde ich das rein rechnerisch nicht richtig.
Trotzdem, gibt's eine gute Lösung?
Bitte schreib die Hexadezimalen Zahlen zusammen. Ansonsten ist
das gleiche wie
und das macht eigentlich keinen Sinn:
Re: in C# Hex-Werte zuweisen
Verfasst: So Jan 30, 2011 12:09 am
von cloidnerux
Warum nimmst du Hexadezimalzahlen, wenn ich fragen darf? Es käme doch bestimmt besser, wenn du normale Dezimalzahlen benutzt.
Wieso sollte es?
Hexadezimalzahlen passen besser zum Dualsystem:
0x01 - 1
0x02 - 10
0x04 - 100
0x08 - 1000
0x10 - 10000
0x20 - 100000
0x40 - 1000000
0x80 - 10000000
Nur weil wir das Hexadezimalsystem im Alltag nicht verwenden, ist es nicht schlechter, nur ungewohnter.
Re: in C# Hex-Werte zuweisen
Verfasst: So Jan 30, 2011 10:59 am
von Gast-110
naums hat geschrieben:Warum nimmst du Hexadezimalzahlen, wenn ich fragen darf? Es käme doch bestimmt besser, wenn du normale Dezimalzahlen benutzt.
MfG Naums
Ich brauche eigentlich die Bit-Muster - für &- oder |-Vergleiche.
Und die Lücken habe ich nur hier im Forum, um die Lesbarkeit zu erhöhen ... (dachte bis jetzt, dass das eine gute Idee ist.).
Die Eingabe b = (int)0x80000000; funzt jedenfalls nicht

Der Fehler ist dann:
Der Konstantenwert "2174783648" kann nicht in "int" konvertiert werden (verwenden Sie zum Überschreiben die unchecked-Syntax). -
Kennt das jemand?
PS.: unchecked soll die "Überlaufprüfung" umgehen - der int soll doch gar nicht überlaufen !!! - Int sind doch 4 Byte - also 0x80000000 ?!?
Gibt es eine Möglichkeit Bit-Muster gleich so einzugeben wie sie sind ???
Re: in C# Hex-Werte zuweisen
Verfasst: So Jan 30, 2011 11:57 am
von Xin
Gast-110 hat geschrieben:Ich brauche eigentlich die Bit-Muster - für &- oder |-Vergleiche.
Und die Lücken habe ich nur hier im Forum, um die Lesbarkeit zu erhöhen ... (dachte bis jetzt, dass das eine gute Idee ist.).
Hehehe, ja ist es, wenn klar ist, dass es kein Quellcodezitat ist.
Gast-110 hat geschrieben:Die Eingabe b = (int)0x80000000; funzt jedenfalls nicht

Der Fehler ist dann:
Der Konstantenwert "2174783648" kann nicht in "int" konvertiert werden (verwenden Sie zum Überschreiben die unchecked-Syntax). -
Kennt das jemand?
Das kann in dem Fall nicht klappen, die Fehlermeldung ist vollkommen korrekt. Int geht nämlich nur bis 2174738647 geht. 2174738648 ist zu groß.
Gast-110 hat geschrieben:PS.: unchecked soll die "Überlaufprüfung" umgehen - der int soll doch gar nicht überlaufen !!! - Int sind doch 4 Byte - also 0x80000000 ?!?
Gibt es eine Möglichkeit Bit-Muster gleich so einzugeben wie sie sind ???
0x80000000 ist schon eine gute Möglichkeit. Das ist das 31. Bit (von Null gezählt). Wenn das 31. Bit true ist, dann ist die Zahl negativ. Ein Hex-Wert ist aber positiv und schon sind wir wieder beim Überlauf.
Du brauchst ein unsigned int, was in C# uint genannt wird, wenn ich mich recht entsinne. Die C#-Entwickler sind da nicht so pingelig und nehmen aus Prinzip int und hier hackt's dann.
Ansonsten kannst Du die Bits auch direkt adressieren: 1 << 31 ist das 31. Bit; also das gleiche wie 0x80000000 und genauso positiv, passt also immernoch nicht auf ein Int.
Für Bitmanipulationen nimm uint.
Re: in C# Hex-Werte zuweisen
Verfasst: So Jan 30, 2011 12:21 pm
von Gast-110
Xin hat geschrieben:... Für Bitmanipulationen nimm uint.
Das hatte ich schon mal - und werde es auch wieder nehmen - so muss ich zwar nochmal alles über-denken / -prüfen, aber ich denke es ist wirlkich die optimale Lösung.
Danke nochmal.
Re: in C# Hex-Werte zuweisen
Verfasst: So Jan 30, 2011 12:33 pm
von Xin
Gast-110 hat geschrieben:Xin hat geschrieben:... Für Bitmanipulationen nimm uint.
Das hatte ich schon mal - und werde es auch wieder nehmen - so muss ich zwar nochmal alles über-denken / -prüfen, aber ich denke es ist wirlkich die optimale Lösung.
Danke nochmal.
Dafür ist das Forum da.

Re: in C# Hex-Werte zuweisen
Verfasst: So Jan 30, 2011 2:55 pm
von Gast-110
Ja es läuft - jetzt - nachdem ich einen anderen Fehler (?) beseitigt habe ->
und wegen diesem Fehler bin ich überhaupt (ohne viel zu denken) von "uint" auf "int" umgestiegen ...
dabei liegt der Fehler gar nicht in meiner Routine sondern im Datei-öffnen. - verstehe aber den Unterschied nicht ...
das soll eigentlich nur eine Datei in ein Array lesen:
Code: Alles auswählen
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
in_string = ofd.FileName;
// Datei öffnen in Array "in_array"
FileStream in_stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read);
BinaryReader br1 = new BinaryReader(in_stream);
in_arr_gr = in_stream.Length;
// in_arr_gr = in_string.Length;
in_array = br1.ReadBytes((int)in_arr_gr);
die vorletzte Zeile habe ich gegen die darüber liegende ausgetauscht, da ich gesehen habe, dass das Array sonst nicht die ganze Datei-größe hatte sondern nur wenige Bytes - aber für mich sind beide Anweisungen identisch (kann ja sein, dass die eine Anweisung mit Cache / Buffer arbeitet, und ich darum nur den ersten Teil erhalte ... - aber wer denkt sich denn sowas aus).
(und ja, es kann sein, dass nutzloser Code darin ist - aber ich bin froh, dass das jetzt läuft ... - obwohl ich gern mehr davon verstehen würde.)
Re: in C# Hex-Werte zuweisen
Verfasst: So Jan 30, 2011 3:01 pm
von Xin
Gast-110 hat geschrieben:Code: Alles auswählen
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Alle Dateien (*.*)|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
in_string = ofd.FileName;
FileStream in_stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read);
in_arr_gr = in_stream.Length;
// in_arr_gr = in_string.Length;
in_array = br1.ReadBytes((int)in_arr_gr);
die vorletzte Zeile habe ich gegen die darüber liegende ausgetauscht, da ich gesehen habe, dass das Array sonst nicht die ganze Datei-größe hatte sondern nur wenige Bytes - aber für mich sind beide Anweisungen identisch (kann ja sein, dass die eine Anweisung mit Cache / Buffer arbeitet, und ich darum nur den ersten Teil erhalte ... - aber wer denkt sich denn sowas aus).
Das eine ist der String des Dateinames "README.txt", das andere der Inhalt der Datei ("Dies ist die Datei README.txt und steht ganz viel unnützes Zeug drin...blabla...")
Da sehe ich schon einen Unterschied.