2013-03-18 62 views
0

我有一個數據string data2 = " %04%02%BC%94%BA%15%E3%AA%08%00%7F%00";我想分割%標誌之間的每兩位數字並將其放入數組中。字符串操作和分割

除此之外,如果有額外的數字,即超過2位數,轉換爲十六進制並將其添加到數組。

我的代碼有時會工作,但是當我在第二個位置添加多餘的數字時,它會給出錯誤的值。

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

輸出如何正確?你如何從'0x04'或'0x4F'獲得'46',這取決於你想如何處理額外的十六進制數字? – 2013-03-18 09:48:02

+0

@RogerLipscombe - '04F'被翻譯成'04 46'。 'F'被轉換爲十六進制 – Liban 2013-03-18 10:14:50

+0

,這是如何「正確」? '0x04F'是'79'。 '0x04'是'4'。 「0x4F」仍然是「79」。你如何從'0x04F'獲得'04 46'。在我沒有熟悉的數字系統中,這是否會發生... – 2013-03-18 10:55:37

回答

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 2013-03-19 03:41:53

2

不能將三位十六進制字符串轉換爲字節。一個字節可以容納的最大值是FF。

1

Values[i].Replace(Values[i].Substring(2, 1), string.Empty);正在取代兩個F的而不僅僅是一個

String.Replace()

看到this post用於位置替換的示例。

+0

索引'substring(2,1)'指的是我認爲的第三個數字..當它增加了額外的字符其他位置,如上面顯示的那個.. – Liban 2013-03-18 10:23:53

+0

請參閱我提供的MSDN鏈接:'String.Replace()'返回一個新字符串,其中指定的Unicode字符在此實例中的所有出現都被替換爲另一個指定的Unicode字符。 'Substring(2,1)'找到F,'Replace()'將它們全部替換掉​​。 – qujck 2013-03-18 10:28:46