<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      分析midea0978的《一個C#算法分析求解》(二)


      一、準備工作
      首先處理以下Calc函數(shù),以方便查看。其實就是變量重命名工作,此時多虧了VS2005的幫忙。
      輸入字符串str,輸入是字節(jié)數(shù)組引用;
      i是字節(jié)數(shù)組的循環(huán)變量;在后面的正式的程序中,將使用大K做為字節(jié)數(shù)組的定位變量。
      k限定了最大字符串是18,原文是k<90,k+=5,縮小5倍就是了;
      n其實就是字符在字符表中的位置,這個字符表其實可以說是一個密碼表了;
      j,莫名其妙的j,其實它也正好是這個算法的關(guān)鍵。

       1public static void Calc(string str, ref byte[] bts)
       2{
       3    ushort j = 11;
       4    uint i = 0;
       5    uint k = 0;// (uint)Math.Min(bts.Length, 18);
       6    int m = 0;
       7    while (i < bts.Length && k < 18)
       8    {
       9        if (!jlist.Contains(j)) jlist.Add(j);
      10
      11        int n = CalcNum(str[m++]);
      12        if (n == -1throw new Exception("Error");
      13        //n = n << (j % 32);
      14        //j最大可能(8-1)+3=10,開始的時候是10,所以實際最大是11
      15        //n = n << j;
      16        //bts[i] = Convert.ToByte(bts[i] | (n / 256));
      17        //bts[i + 1] = Convert.ToByte(bts[i + 1] | (n % 256));
      18        if (j < 8)
      19        {
      20            //j=3~7,n=0~31,n<<j = 0~31<<7, n/256=n>>8=0~15
      21            n = n << j;
      22            bts[i] = Convert.ToByte(bts[i] | (n / 256));
      23            bts[i + 1= Convert.ToByte(bts[i + 1| (n % 256));
      24            j += 3;
      25            i++;
      26        }

      27        else
      28        {
      29            //n = n << j;
      30            //bts[i] = Convert.ToByte(bts[i] | (n / 256));
      31            n = n << (j - 8);
      32            //n=0~31<<3=0~255
      33            bts[i] = Convert.ToByte(bts[i] | n);
      34            //左移超過8位,所以右邊8位一定是0,然后bts[i+1]又是0
      35            //bts[i + 1] = Convert.ToByte(bts[i + 1] | (n % 256));
      36            j -= 5;
      37        }

      38        k += 1;
      39    }

      40}

       


      二、常數(shù)序列J
      從代碼看J不斷變大又變小,必然存在一個循環(huán)過程,下面先說明這一點:
      J的變化,就好像一個自迭代函數(shù),只要知道任意一個J,就可以得到下一個;
      并且,對于兩個相同的J,下一個J必然相等;
      同時,J被限定在一個有限的區(qū)間內(nèi),3~10(8-5=3,(8-1)+3=10),
      所以,隨著個數(shù)增多,J必然循環(huán)。
      計算得到,初始向量是11,循環(huán)節(jié)是[6, 9, 4, 7, 10, 5, 8, 3]。
      從以下數(shù)據(jù)表可以看出:
      ID    -N    N     J     K
      0     21    43008 11    0
      1     11    704   6     0
      2     27    13824 9     1
      3     19    304   4     1
      4     1     128   7     2
      5     25    25600 10    3
      6     18    576   5     3
      7     17    4352  8     4
      8     12    96    3     4
      9     16    1024  6     5
      10    4     2048  9     6
      11    3     48    4     6
      12    28    3584  7     7
      13    5     5120  10    8
      14    9     288   5     8
      15    0     0     8     9
      16    10    80    3     9
      17    22    1408  6     10

      三、從J看字符串和字節(jié)數(shù)組的關(guān)系
      而已發(fā)現(xiàn),對于J來說,小于8和大于等于8是兩種截然不同的情況。
      只有J小于8時,字節(jié)數(shù)組的位置變量才會增加,而大于等于8是不加的,
      所以,這就是字符數(shù)比字節(jié)數(shù)多的關(guān)鍵所在了。
      因為J的序列已經(jīng)確定了,只要指定字符的個數(shù),它們對應(yīng)的J也就確定了,
      然后哪個字符對應(yīng)第幾個字節(jié)(位置K)也就容易確定了。
      上面的數(shù)據(jù)表中可以看到J和K的關(guān)系

      四、代碼簡化
      源碼中的CalcNum其實就是查找一個字符串在字符表中的位置,其實使用字符串的IndexOf函數(shù)就可以了。
      把三個核心語句拆分到if(i<8)中去:
      n = n << (j & 0x1f);
      bts[i] = Convert.ToByte(bts[i] | ((n & 0xff00) >> 8));
      bts[i + 1] = Convert.ToByte(bts[i + 1] | (n & 0xff));
      當(dāng)j>=8時,n先左移j位,所以第三句的 n & 0xff必然為0,所以修改bts[i+1]的這一句對于j>=8沒有意義

      五、構(gòu)造類對象
      為了建立各種參數(shù)間的關(guān)系,特建立了一個CharObject類,對應(yīng)字符串的一個字符。
      成員:ID(序號),Next(下一對象),J(常數(shù)序列),N(字符在密碼表中的位置),
      N_Hight(高位),N_Lower(低位),C(字符),Bts(對應(yīng)的數(shù)組),K(對應(yīng)數(shù)組中的位置)。
      各種計算邏輯,都已經(jīng)融入到屬性當(dāng)中。
      指定Next屬性時,馬上就可以計算得到下一對象的J和K;
      指定K屬性的時候,就可以根據(jù)當(dāng)前N計算Bts[K]和Bts[K+1]了;
      如果N改變了,也可以調(diào)用Cal重新計算Bts[K]和Bts[K+1]。
      靜態(tài)方法Calc是根據(jù)字符串得到字節(jié)數(shù)組的;ReCalc根據(jù)字節(jié)數(shù)組得到字符串,也就是逆向計算了。

       

      posted @ 2007-12-01 21:37  大石頭  閱讀(527)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 视频一区视频二区制服丝袜| 国产精品久久蜜臀av| 亚洲精品无码高潮喷水A| 久久99九九精品久久久久蜜桃| 视频一区视频二区视频三区| 亚洲精品自拍在线视频| 国产强奷在线播放免费| 精品久久免费国产乱色也| 国精品无码一区二区三区左线| 一本久道久久综合中文字幕| 亚洲中文字幕一区二区| 四虎精品视频永久免费| 午夜好爽好舒服免费视频| 国产成A人片在线观看视频下载| 东方四虎在线观看av| 阳春市| 亚洲国产成人综合自在线| 欧美肥老太牲交大战| 国产成AV人片久青草影院| 亚洲国产精品线观看不卡| 人人妻人人澡人人爽欧美一区双 | 日韩中文字幕国产精品| 精品人妻伦一二三区久久aaa片| 国产三级精品三级在线看 | 99在线精品国自产拍中文字幕 | 国产免费高清69式视频在线观看| 吴江市| 国产女人看国产在线女人| 亚洲国产精久久久久久久春色| 一道本AV免费不卡播放| 视频一区二区三区高清在线| 男女猛烈无遮挡免费视频| 国产性生大片免费观看性| 免费国产午夜理论片不卡| XXXXXHD亚洲日本HD| 中文在线天堂中文在线天堂| 亚洲乱码国产乱码精品精大量 | 中文国产不卡一区二区| 国产日韩综合av在线| 国产白丝无码免费视频| 国产老头多毛Gay老年男|