C# System.ArgumentException
Übersicht Andere Programmiersprachen Allgemein
TrustBetreff: C# System.ArgumentException |
Do, Sep 21, 2017 11:33 Antworten mit Zitat |
|
---|---|---|
Hallo,
habe eine merkwürdige Exception: wenn ich 4 Bytes an einer bestimmten Speicheradresse aus dem Speicher auslese, und den Wert dann ausgeben möchte, funktioniert alles wunderbar. Ich konvertiere es zu Int32 und gebe es aus. Code: [AUSKLAPPEN] ( BitConverter.ToInt32(buffer, 0) + "\n" ) )
Lese ich nun 1 oder 2 Byte aus und möchte es wie oben mit konvertierung ausgeben, bekomme ich eine Exception: Zitat: System.ArgumentException:
Destination array is not long enough to copy all the items in the collection. Check array index and length. -> Main.cs:line 65 Wieso reicht die länge des Arrays bei 4 Byte, allerdings nicht bei 2 oder gar einem Byte. Solange buffer <= 4 Byte ist, sollte es doch keine Probleme geben? Ich denke eher, dass es daran liegt dass er auf einen Index zugreifen möchte den es bei kleiner 4 Byte nicht gibt (da int32 = 4 byte). Dachte aber, alles was kleiner ist, passt rein - also kein Problem. Um es nun Datentyp unabhängig zu machen, wollte ich es zu String konvertieren und ausgeben, dann kommt allerdings eine Ausgabe heraus, die so nicht erwünscht ist. Bei 4 Byte: "64-00-00-00", 2 Byte: "64-00", 1 Byte: "64". 64 wäre der Hexadezimalwert von 100. Brauche aber den Dezimalwert. Hier mal ein Screenshot dazu: |
||
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen. |
count-doku |
Do, Sep 21, 2017 13:39 Antworten mit Zitat |
|
---|---|---|
Hi,
die Exception kommt, weil BitConverter.ToInt32 versucht 4 Byte aus dem Array zu lesen (Da du die ToInt32 Methode benutzt). Benutze stattdessen die ToInt16 Methode für 2 Byte lange Werte oder halt direkt ein "(int)" für einzelne Bytes. Bei solchen "internen" Fehlern hilft oftmals ein Blick in den .net Sourcecode: http://referencesource.microso...ter.cs,206 Da sollte das Problem recht offensichtlich sein. Du könntest dir jetzt z.B. einen BitConverter für Ints selber bauen, der unabhängig von der Länge arbeitet. Zum Beispiel über eine For-Schleife. lg, Jannis |
||
Trust |
Do, Sep 21, 2017 14:21 Antworten mit Zitat |
|
---|---|---|
Ach natürlich - ToInt16 und ToInt64 für 2 bzw 8 byte. (Arbeite zum ersten mal mit C# und .net)
Danke für den Link, der ist super. Zitat: ...oder halt direkt ein "(int)" für einzelne Bytes...
Leider kann man (int) nicht auf ein Byte[] array anwenden. Der BitConverter hat da auch nichts parat. EDIT Ok, habe es nun so gelöst: Das erste Element des Bytearrays in einen String konvertiert. (bei einem Byte braucht man nur exakt das erste Element). Diesen String dann in ein Byte konvertiert und schließlich an die Long Outputvariable übergeben zum ausgeben. (Long deshalb da diese Variable bis maximal Int64 (8 Byte) speichern können muss.) Das sieht dann so aus: Code: [AUSKLAPPEN] long decOutput = 0;
string output = buffer[0].ToString(); decOutput = Convert.ToByte(output, 10); Zitat: ...Du könntest dir jetzt z.B. einen BitConverter für Ints selber bauen, der unabhängig von der Länge arbeitet...
Habe das jetzt mal so gelöst: Code: [AUSKLAPPEN] //Converts a byte array into a decimal number (supports only 1, 2, 4 and 8 byte array atm)
long ConvertToDecimal(byte[] bytes) { long decOutput = 0; switch (bytes.Length) // Value Type { case 1: string output = bytes[0].ToString(); decOutput = Convert.ToByte(output, 10); return decOutput; case 2: decOutput = BitConverter.ToInt16(bytes, 0); return decOutput; case 4: decOutput = BitConverter.ToInt32(bytes, 0); return decOutput; case 8: decOutput = BitConverter.ToInt64(bytes, 0); return decOutput; default: return 0; } } Jetzt funktioniert alles. Danke |
||
CO2ehemals "SirMO" |
Do, Sep 21, 2017 17:51 Antworten mit Zitat |
|
---|---|---|
Hallo,
für case 1 kannst Du meines Wissens nach auch einfach byte[0] zurückgeben, oder nicht? |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
Trust |
Do, Sep 21, 2017 20:56 Antworten mit Zitat |
|
---|---|---|
Stimmt, hast recht.
Kommt ja bei beiden Varianten das Selbe raus. Manchmal denke ich einfach zu kompliziert... Danke! |
||
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen. |
Übersicht Andere Programmiersprachen Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group