How to copy a piece of data from a string?

0

I'm starting in the programming area and I'm developing a serial communication application, where, I get data strings with some information in which I need to separate them by categories, for example:

A connection string: STX8abcdefETX<CRC>

A string of Parameters: STXNabcdefETX<CRC>

where,

asked by anonymous 24.07.2017 / 21:25

3 answers

0

Of course there are several ways to do this, I tried to make a didactic code for you to understand the logic, I hope to help:

        //Exemplo da mensagem recebida
        string mensagem = "STXMEnsagem1ETXSTXMEnsagem2ETXSTXMEnsagem3ETXSTXMEnsagem4ETXSTXMEnsagem5ETXSTXMEnsagem6ETX";
        //Lista para armazenar as mensagens
        List<string> mensagens = new List<string>();


        while (mensagem.Length > 0)
        {
            //Encontra o próximo STX
            int i1 = mensagem.IndexOf("STX");
            //Encontra o próximo ETX a partir do STX anterior
            int i2 = mensagem.IndexOf("ETX",i1);


            //Pega a SubString
            string sub = mensagem.Substring(i1+3,i2-3);
            //Retira a parte já processada da mensagem
            mensagem = mensagem.Remove(0, sub.Length+6);
            //Adiciona a mensagem à lista de mensagens
            mensagens.Add(sub);
        }

        //Quantidade de mensagens recebidas
        int count = mensagens.Count;

        //Imprime as mensagens na tela
        foreach (string s in mensagens)
            Console.WriteLine(s);

ps. I did not make any error handling.

I think that STX and ETX should be just a char, thus avoiding the +3, -3, +6, etc. calculations.

    
24.07.2017 / 23:43
0

Here's one more way to do it:

 public IEnumerable<string> ParseMessages( string messages )
 {
     //Separa o texto por STX....ETX
     var msgs = System.Text.RegularExpressions.Regex.Matches( messages, "STX.+?ETX" );

     foreach( var message in msgs ) 
         yield return message.Value;

     //Pega os dois ultimos digitos do crc
     yield return messages.Substring( messages.Length - 2 );
 }
    
25.07.2017 / 16:50
0

I think the best way to do this is with Regex , see how it would look:

string[] arr = Regex.Split(valores, @"(?=STX)");
arr =  arr.Where(x => !string.IsNullOrEmpty(x)).ToArray();
listBox1.Items.AddRange(arr);

Do not forget to add the namespaces in the project:

using System.Linq;
using System.Text.RegularExpressions;

See working at Ideone .

See also the documentation for the Regex to better understand how it works.

    
25.07.2017 / 00:07