webForumDet fria alternativet

Översätta VB6 till C#

.NET

9 svar · 744 visningar · startad av Zaiman

Medlem sedan dec. 20014 239 inlägg
Frågan#1

Hallå har suttit ett bra tag med detta nu och snurrat till det rejält. Får det inte att stämma.

Oginalet som ska översättas ser ut så här:

Make_Subset_C()
            
  '*** Start C has value of 105
	Total% = 105             

	'*** Add Start Character to output
	BarCodeData.Text = Chr$(137) 

	'*** Make sure there are an even number of digits
	If Len(UserText.Text) Mod 2 <> 0 Then UserText.Text = "0" + UserText.Text
        
	'*** Initialize k to keep track of position value
	k% = 1
	
	'*** Loop through the data & read each pair of characters
	For I% = 1 To Len(UserText.Text)

		'*** Need to remap this character if it appears
		If Asc(Mid$(UserText.Text, I%, 1)) = 127 Then
			BarCodeData.Text = BarCodeData.Text + Chr$(139)
		End If

		'*** Need to remap this character if it appears
 		If Asc(Mid$(UserText.Text, I%, 1)) = 32 Then
                    BarCodeData.Text = BarCodeData.Text + Chr$(192)
            Else 
			BarCodeData.Text = BarCodeData.Text + Chr$(Val(Mid$(UserText.Text,_ 			I%, 2)) + 32)
            End If
            
            '*** Multiply position * value and add to existing total
		Total% = Total% + (Val(Mid$(UserText.Text, I%, 2)) * k%)
            
            k% = k% + 1
            I% = I% + 1
        
        Next I%
            
      '*** get the MOD 103 check digit value      
	Total% = Total% Mod 103
          
	'*** remap character if it appears
	If Total% = 0 Then Total% = 113
            
	'*** Add check digit to output	
	BarCodeData.Text = BarCodeData.Text + Chr$(Total% + 32)
           
	'*** Add stop character to output
	BarCodeData.Text = BarCodeData.Text + Chr$(138)
      
      '*** Loop through code and remap space characters
	Temp$ = ""
	For I% = 1 To Len(BarCodeData.Text)
              
		If Asc(Mid$(BarCodeData.Text, I%, 1)) = 32 Then
			Temp$ = Temp$ + Chr$(192)
		Else
			Temp$ = Temp$ + Mid$(BarCodeData.Text, I%, 1)
		End If
            
	Next I%
           
	BarCodeData.Text = Temp$
            
end sub

Efter många försök har jag inte fått till det :(

Min snurriga, virriga kod just nu (jag vet att den inte är snygg :r )

namespace Lab
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string s = code128C(txtIn.Text);
            txtUt.Text = s.ToString();
            
        }
        private string code128C(string txt)
        {
            string txtRetur = "";
            string start = new string((char)0137, 1);
           
            // Fixa till längden på inkommande sträng
            if (txt.Length % 2 != 0)
            {
                txt = "0" + txt;
            }
            string tmpText = txt;
            
            //Längen på strängen parvis
            int k = txt.Length ;

            for (int i = 0; i < k; i++)
            {
                    string s = Mid(txt, i,1);
                    int myChar = Convert.ToInt32(s);
                    MessageBox.Show(myChar.ToString(), "s", MessageBoxButtons.OK);
                    if (myChar == 127)
                    {
                        string str = new string((char)0139, 1);
                        txtRetur += str;
                    }
                    if (myChar == 32)
                    {
                        string str = new string((char)0192, 1);
                        txtRetur += str;
                    }
                    else
                    {
                        string b = Mid(txt, 0, 2);
                        int myChar1 = Convert.ToInt32(b);
                        myChar1 = myChar1 + 32;
                        string str = new string((char)myChar1, 1);
                        txtRetur = txtRetur + str;
                    }
                   //txt = txt.Remove(0, 2);
              
            }
            txtRetur = start + txtRetur;
            int sum = Code128CChecksum(txt);
            if (sum == 0)
            {
                sum = 113;
            }
            else
            {
                sum = sum + 32;
            }
            string strCheck = new string((char)sum, 1);
            txtRetur = txtRetur + strCheck;

            return txtRetur;

        }
      
        private int Code128CChecksum(string chk)
        {
            int i = 1;
            int sum = 105; //Summan 105 är startkoden för 128C

            int k = chk.Length;
            for (int a = 1; a <= k; a++)
            {
                string s = chk.Substring(0, 2);
                int myChar = Convert.ToInt32(s);
                sum = sum + (myChar * i);
                i++;
            }
            sum = (sum % 103);
          
            return sum;
        }

  

        private string MakeCode128C(string txt)
        {
            int start = 105;
            // string startChar = new string((char)0137, 1);
            string returnText = new string((char)0137, 1); ;
            //Kontrollera att strängen är jämt delbar annars lägg till 0 i början av strängen
            if (txt.Length % 2 != 0)
            {
                txt  = "0" + txt;
            }

            //Antal par siffror
            int par = txt.Length / 2;
            int k = 1;
            int i = 1;
            foreach(char c in txt)
            {
                int iAsciiValue = Convert.ToInt16(c);
                // int iAsciiValue = Convert.ToInt32(((int)c).ToString());
                if(iAsciiValue  == 127)
                {
                    string s = new string((char)0139, 1);
                    returnText = returnText + s;
                }
                if (iAsciiValue == 32)
                {
                    string s = new string((char)0192, 1);
                    returnText = returnText + s;
                }
                else
                {
                    int myChar = Convert.ToInt16(Mid(txt, i, 2))+32;
                    string str = new string((char)myChar, 1);
                    returnText = returnText + str;
                }
                start = start + (Convert.ToInt32(Mid(txt, i, 2)) * k);
                k++;
                i++;
            }

            //Kontroll tecken
            start = start % 103;
            if (start == 0)
            {
                start = 113;
            }
            
            // Lägg till Kontrolltecken i strängen
            int controlChar = start + 32;
            string kontrolltkn = new string((char)controlChar, 1);
            returnText = returnText + kontrolltkn;             
            
            // Konvertera space tecken
            string strRetur = "";
            i = 1;
            foreach (char c in returnText)
            {
                int iAsciiValue = Convert.ToInt32(c);
                if (iAsciiValue == 32)
                {
                    string s = new string((char)0192, 1);
                    strRetur = strRetur + s;
                }
                else
                {
                    strRetur = strRetur + Mid(returnText, i, 1);
                }
                i++;
            }

            returnText = strRetur;
            
            return returnText;
        }

        private int ChecksumC(string chk)
        {
            int i = 1;
            int sum = 105; //Summan 104 är startkoden för 128B

            foreach (char c in chk)
            {
                int tal = (int)c - 32;
                sum = sum + (tal * i);
                i++;
            }
            sum = sum % 103;
            return sum;
        }
        private string Mid(string param, int startIndex, int length)
        {
            //start at the specified index in the string ang get N number of
            //characters depending on the lenght and assign it to a variable
            string result = param.Substring(startIndex, length);
            //return the result of the operation
            return result;
        }
    }
}

Någon som kanske redan gjort detta eller kan hjälpa mig på traven. Trött i knoppen och blir avbruten hela tiden. Det hela handlar alltså om teckenkonvertering och checksumma för streckkoder.

Tacksam för all hjälp.

Medlem sedan aug. 20003 575 inlägg
#2

Varför översätta?
Sätt upp kraven på vad som skall utföras och utgå ifrån dom tycker jag.

Medlem sedan dec. 20014 239 inlägg
#3

Kraven är dem samma som i VB koden. Lösningen ska generera samma sträng som VB koden. Så i princip blir det en översättning av koden.

Sen om lösningen är exakt översatt från VBkoden eller helt annorlunda ska resultatet bli detsamma. :)

Medlem sedan dec. 20014 239 inlägg
#4

Kommit en bir på äg nu iaf. Men får inte till undantagen, det fungerar bra så länge inkommande sträng är jämnt antal tecken.

{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string s = code128C(txtIn.Text);
            // string str = new string((char)0192, 1);
            txtUt.Text = s.ToString();
            
        }
        private string code128C(string txt)
        {
            string txtRetur = "";
            string start = "‰";
            string strStop = "Š";
           
            // Fixa till längden på inkommande sträng
            if (txt.Length % 2 != 0)
            {
                txt = "0" + txt;
            }
            string tmpText = txt;
            
            //Längen på strängen parvis
            int k = (txt.Length /2) ;

            for (int i = 1; i <= k; i++)
            {
                    string s = Mid(txt, 0,2);
                    int myChar = Convert.ToInt32(s) + 32;
                    if (myChar == 32)
                    {
                        string str = new string((char)0192, 1);
                        txtRetur = txtRetur + str;
                    }
                    else if (myChar == 127)
                    {
                        string str = new string((char)0139, 1);
                        txtRetur = txtRetur + str;
                    }
                    else
                    {
                        string str = new string((char)myChar, 1);
                        txtRetur = txtRetur + str;
                    }
                   
                    txt = txt.Remove(0, 2);
              
            }

            int sum = Code128CChecksum(tmpText);
            txtRetur = start + txtRetur;
            if (sum == 0)
            {
                sum = 113;
            }
            else
            {
                sum = sum + 32;
            }
            string strCheck = new string((char)sum, 1);
            txtRetur = txtRetur + strCheck + strStop;

            return txtRetur;

        }
      
        private int Code128CChecksum(string chk)
        {
            int i = 1;
            int sum = 105; //Summan 105 är startkoden för 128C

            int k = chk.Length / 2;
            string tmp = chk;

            for (int a = 1; a <= k; a++)
            {
                string s = tmp.Substring(0, 2);
                int myChar = Convert.ToInt32(s);
                sum = sum + (myChar * i);
                i++;
                tmp = tmp.Remove(0, 2);
            }
            sum = (sum % 103);
          
            return sum;
        }

      private string Mid(string param, int startIndex, int length)
        {
            //start at the specified index in the string ang get N number of
            //characters depending on the lenght and assign it to a variable
            string result = param.Substring(startIndex, length);
            //return the result of the operation
            return result;
        }
    }
}

Säkert går det att lösa på andra bättre sätt.. Men jag lär mig lite i taget.
Någon som har någon idé ?

Medlem sedan dec. 20014 239 inlägg
#5

Ingen som har någon idé om hur man får till undantagen?

Medlem sedan dec. 20014 239 inlägg
#6

Har nog kommit igenom allt men är lite osäker på om allt är rätt. Hittils fungerar det ok.

Medlem sedan dec. 20014 239 inlägg
#7

Äh hittade mer fel så det funkar inte *suck*

Medlem sedan mars 20023 561 inlägg
#8

Då kan det ju alltid vara en idé att posta felen här för att få lite hjälp om man känner att man behöver det. ;)

Medlem sedan dec. 20014 239 inlägg
#9

Här kommer kod :)

Först den som är direkt översatt, den får jag såklart fel i eftersom den väljer mitt i en loop 2 tecken helt plötsligt medans den loopar igenom för varje tecken. Såklart att substring out of range inträffar. Inget konstigt med det. Den är mest för att få till det översättningsmässigt. Så kanske det bara är något enkel att korrigera som inte jag har grepp om :r

    public static string code128Cny(string txt)
    {
        int total = 105;
        //Start tecken för 128C
        string strReturn = "‰";

        // Kontrollera längen på strängen om ojämn lägg till en nolla i början
        if (txt.Length % 2 != 0)
        {
            txt = "0" + txt;
        }

        // initera k för att hålla koll på positionen
        int k = 1;

        // Räkna igenom alla tecken och parvis
        for (int i = 1; i < txt.Length; i++)
        {
            string s = txt.Substring(i, 1);
            if (Convert.ToInt32(s) == 127)
            {
                strReturn = strReturn + "‹";
            }
            if (Convert.ToInt32(s) == 32)
            {
                strReturn = strReturn + "À";
            }
            else
            {
                string s1 = txt.Substring(i,2);
                int s2 = Int32.Parse(s1) + 32;
                string str = new string((char)s2, 1);
                strReturn = strReturn + str;
            }
            total = total + (Int32.Parse(txt.Substring(i, 2)) * k);
            k++;
        }

        // Utvinn checksiffra
        total = (total % 103);
        
        // Checksiffra får ej vara 0 mappa om till 113
        if (total == 0)
        {
            total = 113;
        }

        // Mappa till ascii
        total = total + 32;

        // Lägg på checksiffra i strängen
        string strC = new string((char)total, 1);
        strReturn = strReturn + strC;

        // Lägg på stoptecken
        strReturn = strReturn + "Š";

        // Loopa igen kontroll efter blanksteg och byt ut dessa
        string temp = "";
        foreach (char c in strReturn)
        {
            if (Convert.ToInt32(c) == 32)
            {
                temp = temp + "À";
            }
            else
            {
                temp = temp + c;
            }
        }
        strReturn = temp;

        return strReturn;

    }

Och så den "fula" som jag knåpat ihop och som fungerar 8 av tio fall ungefär :r

   public static string code128C(string txt)
    {
        
            string txtRetur = "";
            string start = "‰";
            string strStop = "Š";

            // Fixa till längden på inkommande sträng
            if (txt.Length % 2 != 0)
            {
                txt = "0" + txt;
            }
            string tmpText = txt;

            //Längen på strängen parvis
            int k = (txt.Length / 2);

            for (int i = 1; i <= k; i++)
            {
                string s = Mid(txt, 0, 2);
                int myChar = Convert.ToInt32(s) + 32;
                if (myChar == 32)
                {
                    string str = new string((char)0192, 1);
                    txtRetur = txtRetur + str;
                }
                else if (myChar == 127)
                {
                    string str = new string((char)0139, 1);
                    txtRetur = txtRetur + str;
                }
                else if (myChar > 127)
                {
                    string sTemp = "1" + s;
                    int tmpChar = Convert.ToInt32(sTemp);
                    string str = new string((char)tmpChar, 1);
                    txtRetur = txtRetur + str;
                }

                else
                {
                    string str = new string((char)myChar, 1);
                    txtRetur = txtRetur + str;
                }

                txt = txt.Remove(0, 2);

            }

            int sum = Code128CChecksum(tmpText);
            txtRetur = start + txtRetur;
            if (sum == 0)
            {
                sum = 113;
            }
            else if (sum > 94)
            {
                sum = sum + 100;
            }
            else
            {
                sum = sum + 32;
            }

            
            //Kolla storlek på kontrolltecken innan.
            
            string strCheck = new string((char)sum, 1);
            txtRetur = txtRetur + strCheck + strStop;

            return txtRetur;

    }
    private static int Code128CChecksum(string chk)
    {
        int i = 1;
        int sum = 105; //Summan 105 är startkoden för 128C

        int k = chk.Length / 2;
        string tmp = chk;

        for (int a = 1; a <= k; a++)
        {
            string s = tmp.Substring(0, 2);
            int myChar = Convert.ToInt32(s);
            sum = sum + (myChar * i);
            i++;
            tmp = tmp.Remove(0, 2);
        }
        sum = (sum % 103);

        return sum;
    }
    private static string Mid(string param, int startIndex, int length)
    {
        //start at the specified index in the string ang get N number of
        //characters depending on the lenght and assign it to a variable
        string result = param.Substring(startIndex, length);
        //return the result of the operation
        return result;
    }

Den har jag knåpat bäst jag kunnat..

Medlem sedan dec. 20014 239 inlägg
#10

*puff* ?

260 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)