C#: sbyte to Integer

skee

Mitglied
Hallo Zusammen,
Ich bin kurz vorm verzweifeln und hoffe, hier kann mir jemand weiterhelfen:

Ich habe einen Socketserver (in Java) geschrieben, der mir Integer-Werte in einen Bytestream schreibt und den an meinen C#-Client schick. Funktioniert mittlerweile ganz gut.
Ich lese den Stream in ein sbyte-Array ein und wenn ich es durchlaufe, sehe ich die gleichen Werte wie im Java auch.
Jetzt will ich mir das sbyte Array (4 Bytes) aber wieder in Integers umwandeln lassen, um damit weiterzuarbeiten. Leider funktioniert das nicht. Ich habe viel gegoogelt, aber keine wirkliche Lösung gefunden.
Kann mir jemand helfen?

Gruß
Skee
 

sheel

I love Asm
Hi

was hast du probiert, und was geht dabei nicht?

Btw, warum sbyte und nicht byte?

Vorausgesetzt, es sind byte, kannst du die Umwandlung auch einfach ca. so machen
(auch wenn es "schönere" fertige Klassensachen gibt):
C#:
uint x = b1<<24 + b2<<16 + b3<<8 + b4;
b1 bis b4 sind eben 4 Bytes, können natürlich auch aus einem Array kommen,
x ist das (unsigned) int.
 

skee

Mitglied
Naja, ich habe unzählige Wege probiert, um aus dem sByte array ein byte array zu machen, um dann funktionen, die aus bytes Integers machen zu verwenden. Aber entweder geht es gar nicht, oder es kommen komische Werte heraus.

Das grundsätzliche Problem ist, dass in Java ein Byte einen Wert zwischen -127 und 128 hat, ein Byte in C# allerdings ist zwischen 0 und 255 groß. Daher muss ich ein sByte nehmen, da dieses auch zwischen -127 und 128 groß ist. Die ganzen Umrechnungsroutinen sind aber immer auf ein Byte-Array ausgelegt.
Hier mal eine kurze Zusammenfassung der Ergebnisse:

Zahl in Java: 150

Byte-Array in Java: [0][0][0][-106]

Byte Array in C#: [0][0][0][150]
Convert.ToInt32(Byte-Array): InvalidCastException
BitConverter.ToInt32(Byte-Array, 0): -1778384896

sByte-Array in C#: [0][0][0][-106]
Convert.ToInt32(sByte-Array): InvalidCastException
 

sheel

I love Asm
Zum signed in Java: Das stimmt schon, Java kennt kein unsigned.
Aber, wie verschickst du das von Java aus?
Wenns wirklich nur die Byte sind kann C# gar nicht wissen, ob das mal signed war.
Wenn du es in C# in ein byte-Array statt sbyte reinempfängst sollte es keinen Unterschied machen:

Zur Umwandlung: Convert sollte man nicht verwenden
Und das Ergebnis vom Bitconverter schaut richtig aus (habs aber nicht nachgerechnet).
Da stellt sich wieder mal die Frage, wie das auf Javaseite zum Array gemacht wird.
Das höchstwertige Byte ist auf Littleendianrechnern nämlich das Letzte.
0 0 0 150 im RAM ist also mathematisch/menschlich gesehen eigentlich 150 0 0 0.
 

skee

Mitglied
Krass...
Wenn ich das normale byte array auslese, und es umkehre, kann ich es mit dem bitconverter umrechnen und es kommt auch das richtige raus. verrückt^^

Danke!