Exception: "Kann System.Byte[*] nicht in System.Byte[] konvertieren"

  • VB.NET
  • .NET (FX) 4.0

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Exception: "Kann System.Byte[*] nicht in System.Byte[] konvertieren"

    Hallo,

    ich muss eine Variable vom Typ Object in System.Byte() konvertieren (wenn man diese Variable im Überwachungsfenster anschaut, ist es ein Byte-Array, siehe Bild). Leider bekomme ich die Exception, dass System.Byte[*] nicht in System.Byte[] konvertiert werden kann. Was bedeutet dieses Sternchen (in C-Sprachen ist es ja ein Pointer) und wie kann ich es richtig machen?

    Im Überwachungsfenster sehe ich noch diese "Byte" als Name, aber über RawValue.Byte konnte ich darauf nicht zugreifen. System.Byte()() war auch falsch.

    @WhitePage Mit welchem Code machst Du das jetzt?
    Probier mal

    VB.NET-Quellcode

    1. Dim by As Byte() = CType(DEINE_OBJECT_VATIABLE, Byte())
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    das ist ein Array mit einer gesetzten lower boundary. Kann man bspw. so erzeugen:

    Visual Basic-Quellcode

    1. Dim p As Array = Array.CreateInstance(GetType(Byte), New Integer() {1}, New Integer() {2})


    Ich schätze, man kann ein solches Array nur kopieren.

    Visual Basic-Quellcode

    1. Dim byteInst(p.Length - 1) As Byte
    2. p.CopyTo(byteInst, 0)

    bzw. alternativ für wirklich nur Bytes (vorsicht, p.Length ist die tatsächlich kopierte Zahl an Bytes und BlockCopy funktioniert nur für Arrays primitiver Datentypen):

    Visual Basic-Quellcode

    1. Dim byteInst(p.Length - 1) As Byte
    2. Buffer.BlockCopy(p, 0, byteInst, 0, p.Length)

    zumindest kenne ich keine Möglichkeit, ein lower-boundary-Array ohne Kopie als Byte-Array zu kapseln. Es geht natürlich auch, wenn du das Array abstrahieren kannst (z.B. zu IList(Of T) und dann die Indices ummappen, aber ich halte kopieren oder schauen, dass die Eingabe keine lower boundary hat, für eine bessere Lösung).

    Btw. sollte man diese Art von Array nicht mehr verwenden, da sie quasi veraltet ist. Mir ist auch keine Kompatibilität außerhalb der Array-Klasse selbst bekannt.

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „~blaze~“ ()

    @~blaze~ Ist es nicht :

    C#-Quellcode

    1. Buffer.BlockCopy(p, 0, byteInst, 0, p.Length * sizeof(byte));
    ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Byte ist 1 Byte groß, daher klappts ohne sizeof, zudem sind die Größen der Primitiven als konstant vorausgesetzt (im Gegensatz zu Zeigern, bspw., die sind nur je System konstant groß):
    Byte/SByte 1 Byte
    Short/UShort 2 Byte
    Integer/UInteger 4 Byte
    Long/ULong 8 Byte
    Single 4 Byte
    Double 8 Byte
    Char 2 Byte
    (Boolean 4 Byte, wenn man das als primitiven Datentyp auffassen kann)

    . Ein Äquivalent zu sizeof gibt's in VB.Net nicht, man kann aber System.Runtime.InteropServices.Marshal.SizeOf verwenden, das geht ähnlich vor.

    Gruß
    ~blaze~
    Vermutlich, um das Alignment beizubehalten. Ist auch bei den IL-Opcodes häufiger so, dass sie mehr Speicher benötigen. Ich weiß nicht mehr, wie herum es war, aber die Werte von sizeof und Marshal.SizeOf sind nicht immer identisch, könnte sein, dass das bei Byte auch der Fall war (bei Chars wars auf jeden Fall so).

    Edit: ich habe gerade nochmal nachgelesen und an anderer Stelle stand, dass Boolean nur 1 Byte groß ist. Ich glaube aber, dass das falsch ist, aber ich könnte es jetzt nicht mehr beschwören.

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    RodFromGermany schrieb:

    @WhitePage Mit welchem Code machst Du das jetzt?
    Probier mal

    VB.NET-Quellcode

    1. Dim by As Byte() = CType(DEINE_OBJECT_VATIABLE, Byte())


    Genau so habe ich es gemacht und obengenannte Exception bekommen.

    ~blaze~ schrieb:

    das ist ein Array mit einer gesetzten lower boundary. Kann man bspw. so erzeugen:

    Ich sehe leider nirgendwo eine Antwort auf meine Frage: wie kann ich ein Objekt (kein Array!!) zu einem Byte-Array konvertieren.

    Ich habe eine Variable MyObject As Object. Sie ist aber in Wirklichkeit ein Byte-Array, wie man es im Überwachungsfenster sieht, ich will nur an die Daten rankommen, um sie zu kopieren. Genauer gesagt will ich nur an bestimmten Stellen andere Werte setzen, die restlichen sollen unverändert bleiben. Dafür muss ich die Werte erst auslesen, sonst könnte ich gleich ein neues Byte-Array erzeugen und dieser Variable zuweisen (funktioniert übrigens problemlos).

    Ich habe gestern ein Workaround erstellt, der diese Werte aus FormattedValue holt (sind als ein String vorhanden), in Bytes umrechnet und den Rest verändert. Somit ist das Problem an sich gelöst. Mich würde es aber trotzdem interessieren, wie ich in so einer Situation vorgehen müsste, wenn ich z.B. keine String-Werte davon habe...

    EaranMaleasi schrieb:

    Vielleicht so:

    Leider funktioniert es nicht, die Werte sind nicht identisch, auch die Länge des Arrays nicht:



    EDIT:
    @EaranMaleasi habe den anderen Vorschlag ausprobiert, da kommt wieder die Exception aus dem ersten Beitrag:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „WhitePage“ ()

    WhitePage schrieb:

    Ich habe eine Variable MyObject As Object.
    Wo kommd die bzw. deren Inhalt her?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim by() As Byte = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
    4. objectToByte(CType(by, Object))
    5. End Sub
    6. Private Sub objectToByte(oo As Object)
    7. Dim by As Byte() = CType(oo, Byte())
    8. End Sub
    9. End Class
    Bilder
    • Object.png

      16,97 kB, 587×337, 120 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Wo kommd die bzw. deren Inhalt her?


    Von einer Klasse, die mir vorgegeben wird. Ich habe keinen Einfluss drauf.

    Aber normale Konvertierung geht eben nicht. Wenn ich nur wüsste, was System.Byte[*] bedeutet... Im Bild vom ersten Posting sieht man im Überwachungsfenster, dass da ein Byte-Array dahinter ist, aber anscheinend irgendwie gekapselt.
    Ich bin mir sicher, dass es irgendwas mit Pointern zu tun hat. Nur kann man halt im VB nicht mit Pointern arbeiten...

    WhitePage schrieb:

    Von einer Klasse, die mir vorgegeben wird.
    Was für eine Klasse ist das?
    .NET oder CLI oder C++?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @WhitePage Oha.
    Nicht Object => Byte()
    sondern
    Object => Object => Byte()
    Bilder
    • Byte.png

      110,97 kB, 627×376, 155 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    WhitePage schrieb:

    Ich denke
    Du hast einen Pointer auf einen Pointer, wie das in C++ heißt.
    Bilder
    • Byte2.png

      20,06 kB, 417×303, 123 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!