2013-03-18 2 views
0

У меня есть данные string data2 = " %04%02%BC%94%BA%15%E3%AA%08%00%7F%00"; Я пытаюсь разделить каждые две цифры между знаком % и поместить его в массив.Обработка строк и их разделение

В дополнение к этому, если есть дополнительная цифра, то есть более двух цифр, преобразовать в Hex и добавить его в массив.

Мой код работает иногда, но когда я добавляю дополнительную цифру во второй последней позиции, она дает неправильные значения.

string data = " %04F%02%BC%94%BA%15%E3%AA%08%00%7FF%00"; 

     List<string> Values = new List<string>(); 

     string[] val = Regex.Split(data2, "%"); 
     byte[] TempByte = new byte[val.Length - 1]; 


     for (int i = 0; i < val.Length; i++) 
     { 
      Values.Add(val[i]); 

      if (Values[i].Length > 2) 
      { 
       //count 
       int count = 0; 
       int n = 2;      //start from digit 2(if ther is any) 
       foreach (char s in Values[i]) 
       { 
        count++; 
       } 
       int index = count - 2;   //index starting at 2 

       while (n <= Values[i].Length -1)  
       { 
        string temp = string.Join(string.Empty, Values[i].Substring(n, 1).Select(c => 
                 ((int)c).ToString("X")).ToArray()); 


        Values.Add(temp); 
        n = n + 1; 
       } 
       //remove the extra digit 
       Values[i] = Values[i].Replace(Values[i].Substring(2, 1), string.Empty); 

      } 
     } 


     Values.RemoveAt(0);      //since digit 0 is always zero 
     string[] TagTemp = Values.ToArray(); 

//Convert to array 

     for (int i = 0; i < val.Length - 1; i++) 
     { 
      TempByte[i] = Convert.ToByte(TagTemp[i], 16); 
     } 

Когда дополнительный символ добавляется в первую позицию, т.е. 04F, выход правильно:

enter image description here

Когда добавляется второй последней позиции, т.е. 7FF вместо 7F 46 это дает только 7.

enter image description here

ли вы, ребята, видите, что не так и как это исправить?

+0

Как правильно вывести данные? Как вы получаете '46' из' 0x04' или '0x4F', в зависимости от того, как вы хотите обрабатывать дополнительные шестнадцатеричные цифры? –

+0

@RogerLipscombe - '04F' переведен на' 04 46'. 'F' преобразуется в шестнадцатеричный – Liban

+0

и как это« правильно »? '0x04F' -' 79'. '0x04' -' 4'. '0x4F' по-прежнему' 79'. Как вы получаете '04 46' от' 0x04F'. В бесчисленной системе, с которой я знаком, это происходит ... –

ответ

2
 string data = " %04F%02%BC%94%BA%15%E3%AA%08%00%7FF%00"; 

    // You need to pick an encoding -- are these things ASCII? 
    var encoding = Encoding.ASCII; 
    var values = new List<byte>(); 

    // Walk over the data (note that we don't increment here). 
    for (int i = 0; i < data.Length;) 
    { 
     // Is this the start of an escaped byte? 
     if (data[i] == '%') 
     { 
      // Grab the two characters after the '%'. 
      var escaped = data.Substring(i + 1, 2); 
      //Console.WriteLine(escaped); 

      // Convert them to a byte. 
      byte value = Convert.ToByte(escaped, 16); 
      values.Add(value); 

      // Increment over the three characters making up the escaped byte. 
      i += 3; 
     } 
     else 
     { 
      // It's a non-escaped character. 
      var plain = data[i]; 
      //Console.WriteLine(plain); 

      // Convert it to a single byte. 
      byte[] bytes = encoding.GetBytes(new[] { plain }); 
      Debug.Assert(bytes.Length == 1); 
      byte value = bytes[0]; 

      values.Add(value); 

      // Increment over that character. 
      i += 1; 
     } 
    } 

    // Print it out, in hex, separated by commas. 
    Console.WriteLine(string.Join(", ", 
         values.Select(v => string.Format("{0:X2}", v)))); 

    // Alternatively... 
    Console.WriteLine(BitConverter.ToString(values.ToArray())); 
+0

Спасибо, Роджер ... ваше решение очень логично. моя грязная .. – Liban

2

Вы не можете преобразовать трехзначную шестнадцатеричную строку в байт. Максимальное значение, которое может хранить байт, - FF.

1

Values[i].Replace(Values[i].Substring(2, 1), string.Empty); заменяет как F, а не только один

String.Replace()

см this post для примера позиционной замены.

+0

индекс' substring (2,1) 'относится к третьей цифре, о которой я думаю .. также хорошо работает, когда добавляется дополнительный символ другие позиции, как показано выше. – Liban

+0

см. ссылку MSDN, которую я поставил: 'String.Replace()' возвращает новую строку, в которой все вхождения указанного символа Юникода в этом экземпляре заменяются другим указанным символом Юникода. 'Подстрока (2,1)' находит F, 'Replace()' заменяет их все. – qujck

Смежные вопросы