2010年7月17日 星期六

解長度不一的字串

學弟定了一個有趣的字串給我


*Y,xxx,yyy,@


其中,有效的資料為xxx與yyy,而xxx與yyy是會因為數值大小,而變長變短


所以它給我的封包有可能是:


*Y,xxx,yyy,@


*Y,xx,yy,@


*Y,x,y,@


或者是類似的變化


因為以前在寫通訊協定時,都是使用固定長度,也就是數值太小時,補0


一開始的想法,就是利用找出「,」的位置,計算2者「,」中間的長度,進而判斷使用何者解碼方式


就是下面那個「比較笨的做法」


但是有了上一次的程式優化的技巧,想到了一個比較簡單的解法,就是「比較聰明的做法」


 


//const char string_data1[]={"*Y,123,456,@"};
//const char string_data1[]={"*Y,23,45,@"};
const char string_data1[]={"*Y,3,6,@"};


int x,y;
int i,j,k;


int main (void){


 //比較笨的做法
 j = 0;
 for (i=3;i<6;i++){


  if(string_data1[i] == ',')break;
  j++;


 }
 switch (j){
  case 1:
   x=string_data1[3]-0x30;
  break;
  case 2:
   x=(string_data1[3]-0x30)*10;  
   x+=string_data1[4]-0x30;
  break;
  case 3:
   x=(string_data1[3]-0x30)*100;
   x+=(string_data1[4]-0x30)*10;    
   x+=string_data1[5]-0x30;
  break;
 }
 
 k=0;
 j = 4+j;
 for (i=j;i<j+3;i++){


  if(string_data1[i] == ',')break;
  k++;
 }


 switch (k){
  case 1:
   y=string_data1[j]-0x30;
  break;
  case 2:
   y=(string_data1[j]-0x30)*10;  
   y+=string_data1[j+1]-0x30;
  break;
  case 3:
   y=(string_data1[j]-0x30)*100;
   y+=(string_data1[j+1]-0x30)*10;    
   y+=string_data1[j+2]-0x30;
  break;
 }


 asm("Nop");


 //比較聰明的做法
 i = 3;
 x = string_data1[i++] - 0x30 ;
 while(string_data1[i] != ','){
  x *= 10 ;
  x += string_data1[i++] - 0x30 ;
 }
 i++;
 y = string_data1[i++] - 0x30 ;
 while(string_data1[i] != ','){
  y *= 10 ;
  y += string_data1[i++] - 0x30 ;
 }
 
 asm("Nop");
}


 


透過這樣的小實驗做練習,真的會提升程式上的技巧,雖然程式的功能是一樣的,但是技巧不同,可能會導致成本的提高,程式閱讀上的困難


5 則留言:

  1. 最聰明的作法你沒說:





    丟給粉紅熊做

    [版主回覆07/19/2010 10:15:16]哈,不是橘子熊嗎? 我印象中丟給他回來後會更有爽度!

    回覆刪除
  2. 那還是丟給學弟,然後去東部完一趟更爽XD
    [版主回覆07/19/2010 10:17:25]玩一次就累了

    回覆刪除
  3. 累了有成果也不錯

    那是十月要參加比賽的機器人機構嗎?

    [版主回覆07/19/2010 10:24:29]新光我也不知道何時要比賽ㄟ,不好意思喔
    到時候,要去的時候再通知你要不要一起去

    回覆刪除
  4. 我一定要跟的啊

    只是那台履帶機我都還沒做好

    本來對方說七月要,結果都靜悄悄,我就繼續擺爛了

    我沒有像學弟那摸甘心

    學弟很像是半夜幫老鞋匠縫鞋子的小精靈

    [版主回覆07/19/2010 10:36:45]現在才7月啊,沒關係啦,慢慢來
    哈哈,你是魯卡ㄟ,什麼事難得倒你?

    回覆刪除
  5. 什麼事難得倒我?   應該是贏過粉紅熊吧

    [版主回覆07/19/2010 10:40:15]這句話肯定是今年最好笑的笑話了

    回覆刪除