VB-Code arbeitet anders als C#-Referenz (VB-Function gibt anderen wert zurück)

  • Allgemein

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von razor8.

    VB-Code arbeitet anders als C#-Referenz (VB-Function gibt anderen wert zurück)

    Hallo Leute, ich habe folgendes Problem: Ich übersetze gerade Teile aus einem älteren C#-Project zu VB.Net aber eine Funktion gibt nicht die gleichen Werte zurück. Woran könnte dies liegen? Ich bin mir eigentlich ziemlich sicher das ich die Operatoren alle richtig übersetzt habe. Input, also die daten mit denen die Funktion arbeitet sind 100% identisch, also sollten beide Funktionen den gleichen Wert zurück geben. Hier die beiden Funktionen:

    C# (Original):

    Quellcode

    1. int compressedsize = buff[0] | (buff[1] << 8) | (buff[2] << 16) | (buff[3] << 24);
    2. int uncompressedsize = buff[4] | (buff[5] << 8) | (buff[6] << 16) | (buff[7] << 24);


    VB (Übersetzung):

    VB.NET-Quellcode

    1. Dim compressedsize As Integer = buffer(0) Or (buffer(1) << 8) Or (buffer(2) << 16) Or (buffer(3) << 24)
    2. Dim uncompressedsize As Integer = buffer(4) Or (buffer(5) << 8) Or (buffer(6) << 16) Or (buffer(7) << 24)


    buff ist ein Byte-Array.

    Danke für euere Hilfe!

    Edit: Lösung

    VB.NET-Quellcode

    1. Dim compressedsize As Integer = (CInt(buffer(0)) Or (CInt(buffer(1)) << 8) Or (CInt(buffer(2)) << 16) Or (CInt(buffer(3)) << 24))
    2. Dim uncompressedsize As Integer = (CInt(buffer(4)) Or (CInt(buffer(5)) << 8) Or (CInt(buffer(6)) << 16) Or (CInt(buffer(7)) << 24))

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „razor8“ () aus folgendem Grund: lösung hinzugefügt!

    Hi
    Ich weiß nicht, inwieweit das in C# anders sein könnte, jedoch ist das so, dass du keine Integer Werte verwendest (statt den Bytes) beim Bitshift. Die Bits, die beim Bitshift überhängen , werden einfach abgeschnitten (was bei beiden Sprachen so ist). Also gilt:

    VB.NET-Quellcode

    1. Dim x As Byte = 255
    2. MessageBox.Show(((x << 8) = 0).ToString())

    Konvertiere die Byte-Werte vor dem Shift in Short oder am Besten in Integers, da du auch 24 bits Shiftest. Optional kannst du auch BitConverter.GetBytes(value) oder BitConverter.ToInt32(array, index) verwenden.

    Gruß
    ~blaze~
    eigt. sieht mir die Übersetzung ebenfalls richtig aus...
    Stimmen denn beide Ergebnisse nicht?
    Lass dir doch mal zwischen Ergebnisse geben(buff(0) Or (Buff(1) << 8) einfach immer nur zwei verknüpfen ;))

    Edit: wahrscheinlich wird blaze recht haben :P aber dann dürfte es doch bei C# nicht funktionieren, oder wird es dort etwa direkt "richtig" konvertiert?!
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Normalerweise dürfte kein Unterschied vorliegen. Der einzig mögliche Unterschied ist (denke ich), dass bei C# bereits vor der Verwendung alle Teile in Integer-Werte konvertiert werden. Somit würde nämlich nicht der <<-Operator von Byte aufgerufen, sondern der von Integer. In VB.Net ist es definitiv der von Byte. Das ist aber nur eine Vermutung. Sonst wäre mir jetzt nichts aufgefallen.

    @razor8: Funktioniert das denn jetzt?

    Gruß
    ~blaze~
    Du hattest recht! Ja die kleinen, feinen unterschiede^^

    für alle: so hats funktioniert

    VB.NET-Quellcode

    1. Dim compressedsize As Integer = (CInt(buffer(0)) Or (CInt(buffer(1)) << 8) Or (CInt(buffer(2)) << 16) Or (CInt(buffer(3)) << 24))
    2. Dim uncompressedsize As Integer = (CInt(buffer(4)) Or (CInt(buffer(5)) << 8) Or (CInt(buffer(6)) << 16) Or (CInt(buffer(7)) << 24))


    vielen dank!