C# System.ArgumentException

Übersicht Andere Programmiersprachen Allgemein

Neue Antwort erstellen

Trust

Betreff: C# System.ArgumentException

BeitragDo, Sep 21, 2017 11:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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:

user posted image
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.

count-doku

BeitragDo, Sep 21, 2017 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 21, 2017 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
 

CO2

ehemals "SirMO"

BeitragDo, Sep 21, 2017 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 21, 2017 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group