none
Conversión Visual Basic a C# RRS feed

  • Pregunta

  • Veamos si alguien me pudiera ayudar con el siguiente Código:

    Van Primero las funciones originales en Visual Basic y en seguida,

    mi "Traducción" de Vb a C#, donde hay un horrendo problema

    explicado en Detalle.

    Esa Functión está Destinada a utilisarse en Linux-Ubuntu-16

    con MonoDeveloper, y NO PUEDO referenciar a Visual Basic en Linux

    de modo que DEBE SER en puro C#

    Agradezco de ante mano vuestra ayuda y quedo atento a alguna respuesta

    #Region " Encriptación "

        Private Function Encripta_Fs(ByVal Texto As String, ByVal Llave As String) As String

            Dim i, C, L As Integer

            Dim A As String = String.Empty

            If String.IsNullOrEmpty(Llave) Then Return Texto

            L = Len(Texto)
            For i = 1 To L
                'Ascii de Dato
                C = Asc(Mid(Texto, i, 1))
                'Ascii de Dato + Ascii de Llave
                C = C + Asc(Mid(Llave, (i Mod Len(Llave)) + 1, 1))
                A &= Chr(C And &HFF)
            Next

            Return A

        End Function

        Private Function Decripta_Fs(ByVal Texto As String, ByVal Llave As String) As String

            Dim i, C, L As Integer

            Dim A As String = String.Empty

            If String.IsNullOrEmpty(Llave) Then Return Texto

            L = Len(Texto)
            For i = 1 To L
                C = Asc(Mid(Texto, i, 1))
                C = C - Asc(Mid(Llave, (i Mod Len(Llave)) + 1, 1))
                A &= Chr(C And &HFF)
            Next

            Return A

        End Function

    #End Region

    Función en C#

    Si el Texto es "Dato" y la Lave es "Key"

    private string Encripta_Fs(string Texto, string Llave)
    {

        if(string.IsNullOrEmpty(Llave)) return Texto;

        int i = 0, L = 0;

        int DatoAsc = 0; string DatoSig = null;
        int ClavAsc = 0; string ClavSig = null;

        string Crip = null;

        //CÓDIGO EN VISUAL BASIC:
        //L = Len(Texto)
        //For i = 1 To L
        //    C = Asc(Mid(Texto, i, 1))
        //    C = C + Asc(Mid(Llave, (i Mod Len(Llave)) + 1, 1))
        //    A &= Chr(C And &HFF)
        //Next

        L = Texto.Length;
        for(i = 1; i <= L; i++)
        {
            //CONVERSIÓN DE VISUAL BASIC A C# POR INSTANT C Y SHARP DEVELOP:
            //C = Microsoft.VisualBasic.Strings.Asc(Texto.Substring(i - 1, 1));
            //C = C + Microsoft.VisualBasic.Strings.Asc(Llave.Substring((i % Llave.Length), 1));
            //A += Microsoft.VisualBasic.Strings.Chr(C & 0xFF).ToString();

            // ESTA FUNCIÓN ESTÁ DESTINADA A LINUX (UBUNTU) EN MONODEVELOP
            // Y NO PUEDO REFERENCIAR EL ESPACIO DE NOMBRES DE VISUAL BASIC
            // (INCOMPATIBILIDAD DE FRAMEWORKS, ENTRE OTRAS RAZONES)

            DatoSig = Texto.Substring(i - 1, 1);                //Signo de Dato
            DatoAsc = (int)Convert.ToChar(DatoSig);             //Ascii de Signo

            ClavSig = Llave.Substring(i % Llave.Length + 1, 1); //Signo de Clave

            //  CUANDO TEXTO = "DATO" Y LLAVE ES = "KEY" , EN LA LÍNEA PRECEDENTE
            //  SE PRODUCE ERROR DE KEY MÁS CORTA QUE DATO
            //  CREO QUE HAY ALGO MALO EN LA OPERACIÓN MODULO EN
            //  I % LLAVE.LENGTH + 1, 1, PERO NO LOGRO ENTENDER QUE PUEDE SER

            ClavAsc = (int)Convert.ToChar(ClavSig);             //Ascii de Signo

            Crip += Convert.ToChar((DatoAsc + ClavAsc) & 0xFF).ToString();

        }

        return Crip;

    }


    Atentamente [Best Regards] [Amicalement] Ivan Pequeño Andrade

    jueves, 19 de noviembre de 2020 18:49

Respuestas

  •  //  CREO QUE HAY ALGO MALO EN LA OPERACIÓN MODULO EN
    //  I % LLAVE.LENGTH + 1, 1, PERO NO LOGRO ENTENDER QUE PUEDE SER

    Creo que es un problema de índices. En VB; la función Mid cuenta los caracteres comenzando por 1. Pero la función Substring de .Net (tanto en C# como en VB.NET) comienza a contar la posición de los caracteres contando desde 0.

    En cuanto a los otros temas del espacio de nombres Microsoft.VisualBasic:

    La función Asc la puedes reemplazar por un simple "cast" a int. Por ejemplo, Asc(c) se convierte en (int)c.

    Similarmente, Chr se puede reemplazar por un cast a Char. P.ej., Chr(n) se convierte en (Char)n.

    • Marcado como respuesta Ivan Pequeño A viernes, 20 de noviembre de 2020 12:30
    viernes, 20 de noviembre de 2020 9:30
    Moderador

Todas las respuestas

  •  //  CREO QUE HAY ALGO MALO EN LA OPERACIÓN MODULO EN
    //  I % LLAVE.LENGTH + 1, 1, PERO NO LOGRO ENTENDER QUE PUEDE SER

    Creo que es un problema de índices. En VB; la función Mid cuenta los caracteres comenzando por 1. Pero la función Substring de .Net (tanto en C# como en VB.NET) comienza a contar la posición de los caracteres contando desde 0.

    En cuanto a los otros temas del espacio de nombres Microsoft.VisualBasic:

    La función Asc la puedes reemplazar por un simple "cast" a int. Por ejemplo, Asc(c) se convierte en (int)c.

    Similarmente, Chr se puede reemplazar por un cast a Char. P.ej., Chr(n) se convierte en (Char)n.

    • Marcado como respuesta Ivan Pequeño A viernes, 20 de noviembre de 2020 12:30
    viernes, 20 de noviembre de 2020 9:30
    Moderador
  • Maestro Alberto,

    Muchas gracias por tus observaciones.

    En efecto, algo pasa con el maldito Módulo...

    Intentaré Aplcarle más cabeza, aunque arece que me está quedando grande

    el problemita, tengo esta función trabajando en Vb hace ya como treinta años

    pero en C#, se puso + que complicado

    Gracias nuevavente


    Atentamente [Best Regards] [Amicalement] Ivan Pequeño Andrade

    viernes, 20 de noviembre de 2020 12:29
  • Alberto,

    Gracias una vez más por tus observaciones:

    Era un problema de Indices, de strings que parten en 0

    y el módulo "Compensa" los largos diferentes entre el dato y la clave.

    (Quizás porque comencé temprano se despejó la cabeza...

    Para probar:

    Dato:  Wolfgang Amadeus Mozart - Compositor Austríaco
    Clave: Nacido en Salzburg

    Lo dejo aqui por si le puede servir a alguien

    private string Encripta_Fs(string Texto, string Llave)
    {

        if(string.IsNullOrEmpty(Llave)) return Texto;

        int i = 0, L = 0;

        int DatoAsc = 0; string DatoSig = null;
        int ClavAsc  = 0; string ClavSig  = null;

        string Crip = null;

        L = Texto.Length - 1;
        for(i = 0; i <= L; i++)
        {
            DatoSig = Texto.Substring(i, 1);                    //Signo de Dato
            DatoAsc = (int)Convert.ToChar(DatoSig);             //Ascii de Signo

            ClavSig = Llave.Substring(i % Llave.Length, 1);     //Signo de Clave
            ClavAsc = (int)Convert.ToChar(ClavSig);             //Ascii de Signo

            Crip += Convert.ToChar((DatoAsc + ClavAsc) & 0xFF).ToString();

        }

        return Crip;

    }

    Y Decripta:

    private string Decripta_Fs(string Texto, string Llave)
    {

        if(string.IsNullOrEmpty(Llave)) return Texto;

        int i = 0, L = 0;

        int DatoAsc = 0; string DatoSig = null;
        int ClavAsc = 0; string ClavSig = null;

        string Crip = null;

        L = Texto.Length - 1;
        for(i = 0; i <= L; i++)
        {
            DatoSig = Texto.Substring(i, 1);                    //Signo de Dato
            DatoAsc = (int)Convert.ToChar(DatoSig);             //Ascii de Signo

            ClavSig = Llave.Substring(i % Llave.Length, 1);     //Signo de Clave
            ClavAsc = (int)Convert.ToChar(ClavSig);             //Ascii de Signo

            Crip += Convert.ToChar((DatoAsc - ClavAsc) & 0xFF).ToString();

         }

        return Crip;

    }

    Esto se puede fundir en una sola Function
    Pasando un parámetro Bool para encriptar
    o desencriptar

    Gracias por la ayuda nueevamente.


    Atentamente [Best Regards] [Amicalement] Ivan Pequeño Andrade

    viernes, 20 de noviembre de 2020 13:26
  • Hola,

     

    gracias por confirmar que encontraste una respuesta a tu pregunta.

     

    Saludos cordiales

     

    Gabriel Castro

    viernes, 20 de noviembre de 2020 13:47
    Moderador