Laden...

Der >>-Operator ist für die Typen "Char" und "String" nicht definiert.

Erstellt von Innocentus vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.148 Views
I
Innocentus Themenstarter:in
70 Beiträge seit 2009
vor 14 Jahren
Der >>-Operator ist für die Typen "Char" und "String" nicht definiert.

Ich habe eine Codezeile aus einen Java-Programm nach VB .NET übernommen (kann auch C# sein - in diesem Falle spielt das keine Rolle).
Nur an einer Stelle hapert das ganze leider noch:

abyte0(i1 = i1 + 1) = (&HE0 Or c1 >> 12 & &HF)

Der Compiler mag das irgendwie nicht:

Der >>-Operator ist für die Typen "Char" und "String" nicht definiert.

Irgendwas scheint Java von selbst zu konvertieren / berücksichtigen.
Vielleicht kann mir jemand hierzu einen Tip geben, wie ich das obige Verhalten in .NET irgendwie zu emulieren?

Vielen Dank für die Antworten im Voraus!
Mit freundlichen Grüßen
Innocentus

\V/ Coolness und ein langes Leben.

173 Beiträge seit 2006
vor 14 Jahren

Schau mal hier:
Datentypen (C# und Java im Vergleich)

Ich denke das Java ein char intern als byte ansieht und deswegen das shiften kann.
Ich vermute mache aus char ein byte und es läuft.
Ansonsten auch mal im Code schauen was du mit der Variable sonst noch so machen willst bzw. einfach mal die Deklarierung posten.

Gruß
Bonvie

I
Innocentus Themenstarter:in
70 Beiträge seit 2009
vor 14 Jahren

Ich habe hierzu jetzt zwei Funktionen gefunden:

Function RShift(ByVal lNum As Long, ByVal lBits As Long) As Long If lBits <= 0 Then RShift = lNum If (lBits <= 0) Or (lBits > 31) Then Exit Function RShift = (lNum And (2 ^ (31 - lBits) - 1)) * _ IIf(lBits = 31, &H80000000, 2 ^ lBits) Or _ IIf((lNum And 2 ^ (31 - lBits)) = 2 ^ (31 - lBits), _ &H80000000, 0) End Function Function LShift(ByVal lNum As Long, ByVal lBits As Long) As Long If lBits <= 0 Then LShift = lNum If (lBits <= 0) Or (lBits > 31) Then Exit Function If lNum < 0 Then LShift = (lNum And &H7FFFFFFF) \ (2 ^ lBits) Or 2 ^ (31 - lBits) Else LShift = lNum \ (2 ^ lBits) End If End Function

Mit freundlichen Grüßen
Innocentus

\V/ Coolness und ein langes Leben.

5.742 Beiträge seit 2007
vor 14 Jahren

Hallo Innocentus,

versuche es eher mal mit einem Cast des chars auf int.

BTW: Welche Datentypen haben deine Variablen überhaupt?!?

I
Innocentus Themenstarter:in
70 Beiträge seit 2009
vor 14 Jahren
Char und Integer vergleichen

Ich habe folgenden Code als Beispiel:


Dim c1 As Char = [...]
c1 >= &H1

Nun beschwert sich aber der Compiler:

Der ≥-Operator ist für die Typen "Char" und "Integer" nicht definiert.

Vielen Dank für die Antworten im Voraus!
Mit freundlichen Grüßen
Innocentus

\V/ Coolness und ein langes Leben.

6.862 Beiträge seit 2003
vor 14 Jahren

Ich habe beide Threads mal zusammengefügt das es sich um das gleiche Grundproblem handelt.

Baka wa shinanakya naoranai.

Mein XING Profil.

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo zusammen,

Ich vermute mache aus char ein byte und es läuft.

beim Portieren von Code von Java nach C#/.NET muss man in dem Zusammenhang - gerade wenn Überläufe erwartet werden - auch unbedingt beachten, dass ein Java-Byte nicht das gleiche wie ein .NET-Byte ist. In Java hat ein Byte den Wertebereich -127 bis 128, in .NET von 0 bis 255.
Das .NET-Pendant zu einem Java-Byte ist SByte.

Gruß,
dN!3L

I
Innocentus Themenstarter:in
70 Beiträge seit 2009
vor 14 Jahren

Gut - ich habe jetzt alle Byte zu SByte gemacht.
Nun gibt es allerdings zwei Probleme:

  1. ASCII.GetBytes(...) mag SBytes nicht - wie kann ich GetBytes trotzdem in Anspruch nehmen?
  2. Socket.Send(...) mag SByte auch nicht - wie kann ich hier das SByte trotzdem senden?

Mit freundlichen Grüßen
Innocentus

\V/ Coolness und ein langes Leben.

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Innocentus,

Gut - ich habe jetzt alle Byte zu SByte gemacht. Nun gibt es allerdings zwei Probleme

Hm, ich sollte die Antwort noch etwas präzisieren. Es kommt auch immer drauf an, was mit den Bytes gemacht wird. Sobald der Zahlwert des Bytes irgendwie wichtig ist (z.B. int nach byte casten, Überläufe), muss man aufpassen, dass man evtl. SByte verwenden muss. In deinem Fall (GetBytes, etc.) dürfte das aber nicht der Fall sein, also kannst du sicher byte verwenden.

Gruß,
dN!3L

P.S.: [Hinweis] Wie poste ich richtig? Punkt 2.3 - Keine Full Quotes

I
Innocentus Themenstarter:in
70 Beiträge seit 2009
vor 14 Jahren

Nun ja - die Zahlenwerte werden tatsächlich auch mal verwendet.
Gut, das Du daran gedacht hast. - Vielen Dank an Dich - damit hast Du mir viele Kopfschmerzen erspart.

Ich habe einen Weg gefunden: Convert.ToSByte(...) oder ToByte(...)

Mit freundlichen Grüßen
Innocentus

\V/ Coolness und ein langes Leben.

2.891 Beiträge seit 2004
vor 14 Jahren

Und wenn ich dann also Funktionen verwende, die Byte verlangen, dann brauche ich also nur noch von SByte nach Byte zu casten, richtig?

Hm, die Hand würde ich dafür jetzt nicht unbedingt ins Feuer legen, aber das sollte gehen. Wenn die Zahlenwerte der Bytes unwichtig sind und nicht damit gerechnet wird, kannst du auch ganz normal byte verwenden.

Gruß,
dN!3L