Avatar billede ibleif Nybegynder
03. februar 2005 - 23:08 Der er 18 kommentarer og
1 løsning

C# til VB.NET

Hejsa alle...

Hvordan får jeg denne C# linje til VB.NET:

cs = ~((cs & 0xffffu) + (cs >> 16))

Nogen foreslag?

// Ibleif
Avatar billede arne_v Ekspert
03. februar 2005 - 23:19 #1
Prøv:

cs = Not ((cs And &HFFFF) + (cs >> 16))
Avatar billede burningice Nybegynder
03. februar 2005 - 23:54 #2
:P :) nu har jeg ledt i en halv time efter den tilde operator. Hvorfor er det at den ikke står nævnt nogen som helst steder som andet end til destructoren?
Avatar billede arne_v Ekspert
04. februar 2005 - 07:16 #3
Den må stå sammen med &, | og ^

(den bruges også i C/C++ og Java - jævnfør evt. http://www.eksperten.dk/artikler/505)
Avatar billede ibleif Nybegynder
04. februar 2005 - 09:52 #4
Selvom jeg har læst din GODE artikel, så må jeg sige at jeg ikke helt fatter hvad den linje egentlig gør. Det er følgende jeg prøver at omskrive:

uint cs = 0;
for (int i = 0; i < pCommand.Length; i = i+2)
  cs += BitConverter.ToUInt16(pCommand, i);
cs = ~((cs & 0xffffu) + (cs >> 16));

Jeg har ikke testet om dit foreslag virker, så det gør det sikkert, men kan godt lide at jeg rent faktisk forstår koden også! :-)

I samme ombæring vil jeg høre om det ikke er lige meget om jeg bruger en Int32 i mit VB-program istedet for den uint?

// Ibleif
Avatar billede arne_v Ekspert
04. februar 2005 - 09:59 #5
Den vender alle bitsene.

~00011110 er 11100001
Avatar billede ibleif Nybegynder
04. februar 2005 - 17:29 #6
Nu må jeg simpelthen give op.. og få noget hjælp!

Følgende C# kode skal jeg have lavet om til VB.NET:
------------------- C# ---------------------------
uint cs = 0;
for (int i = 0; i < pCommand.Length; i = i+2)
  cs += BitConverter.ToUInt16(pCommand, i);
cs = ~((cs & 0xffffu) + (cs >> 16));

tel[2] = (byte) cs;
tel[3] = (byte) (cs >> 8);
------------------- C# ---------------------------

Jeg er kommet frem til at en "uint" svarer til en System.UInt32, så ville tro at jeg skulle lave det således her:

------------------- VB.NET -----------------------
Dim cs As UInt32
For i As Int32 = 0 To i < pingCommand.Length Step 2
  cs += BitConverter.ToUInt16(pingCommand, i)
Next
cs = Not ((cs And &HFFFF) + (cs >> 16))

tel(2) = CType(cs, Byte)
tel(3) = CType((cs >> 8), Byte)
------------------- VB.NET -----------------------

Det giver bare følgende fejl:

VB.NET linje 3 (inde i for/next) : "Operator '+' is not defined for types 'System.UInt32' and 'System.UInt16'." - og det hjælper ikke at lave det om til
"ToUInt32()" - Den siger det samme at operator '+' is not defined.

De 3 linjer efter for/next giver også fejl... At Operatoren 'AND' og '>>' ikke kan bruges der.

Får snart grå hår! :-)

// Ibleif
Avatar billede arne_v Ekspert
04. februar 2005 - 18:43 #7
Ja.

Du er nødt til at bruge enten Integer eller Long, da du i VB.NET ikke
kan bruge operatorer på de boxede typer.
Avatar billede ibleif Nybegynder
04. februar 2005 - 20:01 #8
hmm.. nu kommer den så fint igennem løkken, men jeg er i tvivl om hvilken BitConverter jeg skal bruge, da jeg ikke kan bruge ToUInt16() jo, men har brug for det samme resultat? Jeg kan ikke få den til at give det rigtige resultat! :-(

Vil meget gerne sætte point op... smider lige 200 point i det, da jeg syntes det er ved at være meget svært!

// Ibleif
Avatar billede arne_v Ekspert
04. februar 2005 - 20:07 #9
Kan du poste hele din C# kode - altså den relevante metode ?
Avatar billede ibleif Nybegynder
04. februar 2005 - 21:24 #10
protected void SetChecksum(byte[] tel)
{
  tel[2] = 0;
  tel[3] = 0;
 
  uint cs = 0;
  for (int i = 0; i < pingCommand.Length; i = i+2)
      cs = cs + BitConverter.ToUInt16(pingCommand, i);
  cs = ~((cs & 0xffffu) + (cs >> 16));

  tel[2] = (byte) cs;
  tel[3] = (byte) (cs >> 8);
}


Der er ikke så meget mere i det.. jeg har lavet følgende kode, som virker syntaxmæssigt, men giver en beregningsfejl efter løkken hvor de nye Byte værdier skal sættes, da det er en forkert værdi jeg får fra Bitconverteren, da jeg ikke kan bruge den ToUInt16 som er brugt i den oprindelige C#:

    Protected Sub SetCheckSum(ByVal tel As Byte())
        '// reset old checksum
        tel(2) = 0
        tel(3) = 0

        '// calculate new checksum
        Dim cs As Int32
        Dim i As Int32 = 0
        While i < pingCommand.Length
            cs += BitConverter.ToInt16(pingCommand, i)
            i = i + 2
        End While

        cs = Not ((cs And &HFFFF) + (cs >> 16))

        '// set new checksum
        tel(2) = CType(cs, Byte)
        tel(3) = CType((cs >> 8), Byte)
    End Sub

// Ibleif
Avatar billede arne_v Ekspert
04. februar 2005 - 21:54 #11
using System;
using System.Text;

public class CsClass
{
    public static void SetChecksum(byte[] pingCommand, byte[] tel)
    {
      tel[2] = 0;
      tel[3] = 0;
      uint cs = 0;
      for (int i = 0; i < pingCommand.Length; i = i+2)
          cs = cs + BitConverter.ToUInt16(pingCommand, i);
      cs = ~((cs & 0xffffu) + (cs >> 16));
      tel[2] = (byte) cs;
      tel[3] = (byte) (cs >> 8);
    }
    public static void Main(string[] args)
    {
        byte[] tel = new byte[4];
        SetChecksum(Encoding.Default.GetBytes("Dette er en lille test"), tel);
        Console.WriteLine(tel[2] + " " + tel[3]);
    }
}
Avatar billede arne_v Ekspert
04. februar 2005 - 21:54 #12
Imports System
Imports System.Text

Public Class VbClass
    Public Shared Sub SetChecksum(ByVal pingCommand As Byte(), ByVal tel As Byte())
        tel(2) = 0
        tel(3) = 0
        Dim cs As Integer = 0
        Dim i As Integer = 0
        While i < pingCommand.Length
            cs = cs + Convert.ToInt32(BitConverter.ToUInt16(pingCommand, i))
            i = i + 2
        End While
        cs = Not ((cs And &HFFFF) + (cs >> 16))
        tel(2) = Convert.ToByte(cs And &hFF)
        tel(3) = Convert.ToByte((cs >> 8) And &HFF)
    End Sub

    Public Shared Sub Main(ByVal args As String())
        Dim tel(4) As Byte
        SetChecksum(Encoding.Default.GetBytes("Dette er en lille test"), tel)
        Console.WriteLine(tel(2) & " " & tel(3))
    End Sub
End Class
Avatar billede arne_v Ekspert
04. februar 2005 - 21:55 #13
Outputter begge:

200 61
Avatar billede ibleif Nybegynder
05. februar 2005 - 06:45 #14
Hej arne!

Er desværre væk hele lørdagen her, så kan først kigge på det søndag! Tak for din indsats, og glæder mig meget til at teste det!

Vender tilbage søndag!

// Ibleif
Avatar billede ibleif Nybegynder
05. februar 2005 - 06:57 #15
Men, lige umildbart kunne jeg godt tænke mig om du kunne forklare hvorfor der er i VB.NET eksemplet er "And &HFF" med i de 2 sidste linjer ?

// Ibleif
Avatar billede arne_v Ekspert
05. februar 2005 - 09:12 #16
Fordi jeg eller får conversion fejl fordi tallet er for stort til en byte.
Avatar billede arne_v Ekspert
05. februar 2005 - 09:12 #17
And &HFF skræller alt det væk som ikk ekan være i en byte.
Avatar billede ibleif Nybegynder
07. februar 2005 - 20:18 #18
Jeg siger mange tak for hjælpen!

Jeg fik det oversat, men var desværre så dum ikke at teste C# eksemplet ordentligt først, så det virkede faktisk ikke 100% efter hensigten fra starten af! :-(

Hvis du ligger et svar arne_v - så kan du (igen!) få dine velfortjente point!

Er glad for den indsats du ligger herinde!

// Ibleif
Avatar billede arne_v Ekspert
07. februar 2005 - 20:24 #19
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester