in C# Hex-Werte zuweisen

Die Programmiersprache C# und Programmierung im .NET Framework/Mono
Gast-110
Beiträge: 11
Registriert: So Jan 02, 2011 1:40 pm

in C# Hex-Werte zuweisen

Beitrag von Gast-110 » Sa Jan 29, 2011 8:52 pm

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?

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: in C# Hex-Werte zuweisen

Beitrag von naums » Sa Jan 29, 2011 9:11 pm

Warum nimmst du Hexadezimalzahlen, wenn ich fragen darf? Es käme doch bestimmt besser, wenn du normale Dezimalzahlen benutzt.

MfG Naums
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: in C# Hex-Werte zuweisen

Beitrag von Xin » Sa Jan 29, 2011 9:51 pm

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

Code: Alles auswählen

a & 0xF0 00 00 00
das gleiche wie

Code: Alles auswählen

a & 16 0 0 0
und das macht eigentlich keinen Sinn:

Code: Alles auswählen

a & 0xF0000000
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: in C# Hex-Werte zuweisen

Beitrag von cloidnerux » So Jan 30, 2011 12:09 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Gast-110
Beiträge: 11
Registriert: So Jan 02, 2011 1:40 pm

Re: in C# Hex-Werte zuweisen

Beitrag von Gast-110 » So Jan 30, 2011 10:59 am

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 :evil:
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 ???

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: in C# Hex-Werte zuweisen

Beitrag von Xin » So Jan 30, 2011 11:57 am

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 :evil:
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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Gast-110
Beiträge: 11
Registriert: So Jan 02, 2011 1:40 pm

Re: in C# Hex-Werte zuweisen

Beitrag von Gast-110 » So Jan 30, 2011 12:21 pm

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: in C# Hex-Werte zuweisen

Beitrag von Xin » So Jan 30, 2011 12:33 pm

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. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Gast-110
Beiträge: 11
Registriert: So Jan 02, 2011 1:40 pm

Re: in C# Hex-Werte zuweisen

Beitrag von Gast-110 » So Jan 30, 2011 2:55 pm

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.)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: in C# Hex-Werte zuweisen

Beitrag von Xin » So Jan 30, 2011 3:01 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten