Sbyte nach Byte konvertieren

Chrono

Grünschnabel
Hallo,

ich habe folgendes Problem. Eine externe .NET Class Libary gibt mir als Rückgabewert einer Funktion ein Sbyte Array. Im nächsten Schritt möchte ich dieses Sbyte Array über die einen Socket an einen Server senden. (System.Net.Sockets.Socket). Das wesentliche Problem ist, dass die Funktion als Parameter nicht ein Sbyte Array sondern ein Byte Array erfordert.

Wie bekomme ich ein Sbyte() zu Byte() ?

Ich weiß, dass Sbyte einen anderen Wertebereich hat als Byte und sich die beiden Wertebereiche nur teilweise überschneiden. Das sollte aber irrelevant sein, denn es geht mir lediglich darum, dass die Bits gleich gesetzt sind. Es muss nichtmal ne Datenkonvertierung stattfinden sondern Visual Basic muss nur den Datentyp anders interpretieren.
 
Hallo Chrono,

ungetestet.

Dim b As Byte
sByte="FF"

b = Byte.Parse(sByte, Globalization.NumberStyles.HexNumber)


Jens
 
Hm, schade, dass das nicht so einfach ist.

Die Methode über das Objekt funktioniert nicht, da Byte nicht von Objekt abgeleitet wurde, so sagts mir Visual Basic. Habe 2 andere Möglichkeiten. Bitte sagt mir welche effizienter arbeitet.

Möglichkeit 1:
Code:
Dim i As Integer
For i = 0 To ArraySByte.GetUpperBound(0)
    ArrayByte(i) = Byte.Parse(ArraySByte(i).ToString("X"), Globalization.NumberStyles.AllowHexSpecifier)
Next

Möglichkeit 2:
Code:
Dim i As Integer
For i = 0 To ArraySByte.GetUpperBound(0)
    ArrayByte(i) = IIf((ArraySByte(i) >= 0), ArraySByte(i), (ArraySByte(i) + 256))
Next
 
Zuletzt bearbeitet:
Ich hätte auch noch eine Möglichkeit (mit .Net 2.0):
Code:
    For i As Integer = 0 To ArraySByte.GetUpperBound(0)
      ArrayByte(i) = Convert.ToByte(Hex(ArraySByte(i)), 16)
    Next

Schätze aber, dass die 2. Möglichkeit die effizenteste ist weil keine Stringoperationen notwendig sind.
 
kannste ja alle 3 möglichkeiten mit zufällig belegten arrays mal mittels der Stopwatch-klasse in .NET 2.0 testen.... bei einer arraygröße von ca 5000 solltest du schon gute vergleichswerte bekommen. Würd mich jetzt interessieren, was da am schnellsten ist;)
 
Hallo,

noch ein Vorschlag für .NET 2.x:
Code:
Dim arrayByte() As Byte = Array.ConvertAll(arraySByte, _
	New Converter(Of SByte, Byte)(AddressOf SByteToByte))

[…]

Public Shared Function SByteToByte(ByVal sb As SByte) As Byte
	Return CType(IIf(sb < 0, sb + 256, sb), Byte)
End Function

Grüße,
Matthias

PS: Erinnert mich dran, dass ich nie wieder was in VB.NET schreibe :p
 
Würd mich jetzt interessieren, was da am schnellsten ist

Hat mich auch interessiert drum hier ein Vergleich mit 1.000.000 Elementen:
Möglichkeit 1: 1735746 Ticks
Möglichkeit 2: 258601 Ticks
Möglichkeit 3: 1370321 Ticks
Möglichkeit 4: 320135 Ticks

Wie ich mir gedacht habe, brauchen die Stringoperationen ziemlich viel Zeit.

Übrigens kann ich die Aussage
PS: Erinnert mich dran, dass ich nie wieder was in VB.NET schreibe
von Matthias nur unterstreichen, denn die Konvertierung in C# schlägt alle 4 Möglichkeiten um Längen und ist zusätzlich noch wesentlich einfacher und verständlicher:
Code:
            for (int i = 0; i < 1000000; i++)
            {
                ArrayByte[i] = (byte)ArraySByte[i];
            }
Möglichkeit C#: 7264 Ticks

Zuerst habe ich geglaubt ich habe mich bei der Arraygröße in C# vertippt :)

Vielleicht gibt es unter C# sogar noch eine einfachere Möglichkeit als mit einer Schleife, hab aber nicht weiter gesucht.
 
Hallo,

pfmayr hat gesagt.:
[…]die Konvertierung in C# schlägt alle 4 Möglichkeiten um Längen und ist zusätzlich noch wesentlich einfacher und verständlicher:
Und noch dazu falsch ;) (Siehe auch meine Signatur.)

Spätestens bei negativen Werten sollte das Casting fehlschlagen.

Grüße,
Matthias
 
Matthias Reitinger hat gesagt.:
Und noch dazu falsch ;) (Siehe auch meine Signatur.)
Spätestens bei negativen Werten sollte das Casting fehlschlagen.
Danke für den Hinweis, Matthias:) .

Dann hast Du sicher eine Erklärung dafür warum bei mir - obwohl falsch -
Code:
            sbyte sbyte1 = 100;
            sbyte sbyte2 = -100;

            byte byte1 = (byte)sbyte1;
            byte byte2 = (byte)sbyte2;

            Console.WriteLine("SByte1: {0} = Byte1: {1}", sbyte1, byte1);
            Console.WriteLine("SByte2: {0} = Byte2: {1}", sbyte2, byte2);

            Console.ReadKey();
  • keinen Laufzeitfehler verursacht
  • die korrekten Werte ausgibt:confused:

Beste Grüße nach Bayern.
 

Neue Beiträge

Zurück