求一个高效率的字符串处理代码

公西雒 2013-12-09 10:38:54
031007FFFF0C10  031007FFFF0F11 031007FF030C10031007FFFF0C10    03  1007 FF FF0C10  031007FFFF0C10  03 10 07 FF 03 0C 10 031007FFFF0C10031007FFFF0C10 031007FFFF0F10031007FFFF0C10031007FF  030C10031007FF 030C10031007FFFF0C10   031007  FF FF 0C 1003   1007FF FF0C 10031007FFFF0F10 031007FFFF 0C10

类似这样一段十六进制的字符串,中间存在不规则分布的空格需要去掉,像031007FFFF0C10这样的7位十六进制字符串是我想获取的一组完整数据,03是起始位,怎么能高效的获取所有数据组?高效哈!
...全文
440 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2013-12-09
  • 打赏
  • 举报
回复
提速效果不超过30%的情况下,就可以用了,用StringBuilder实现字符串拼接虽然不能说是最快,但也很快了,循环本身只有单向的处理,因此速度也不存在问题。此外还有通过索引多次SubString的处理方式,不见得有比这样的快,彼此速度都差不多的情况下,这样循环写还可以在中间添加控制,即判断每次开始是否为“03”,虽然我没加。
公西雒 2013-12-09
  • 打赏
  • 举报
回复
引用 1 楼 qldsrx 的回复:
随手写的。 去空格:String.Replace(input," ",""); 获取字符串: List<string> result = new List<string>(); StringBuilder sb = new StringBuilder(); for(int i =0;i<str.Length;i+=1) { sb.Append(str[i]); if(i%14==13) { result.Add(sb.ToString()); sb.Clear(); } }
高效体现在哪?求教
qldsrx 2013-12-09
  • 打赏
  • 举报
回复
随手写的。 去空格:String.Replace(input," ",""); 获取字符串: List<string> result = new List<string>(); StringBuilder sb = new StringBuilder(); for(int i =0;i<str.Length;i+=1) { sb.Append(str[i]); if(i%14==13) { result.Add(sb.ToString()); sb.Clear(); } }
智商余额不足 2013-12-09
  • 打赏
  • 举报
回复
引用 27 楼 yuyang00000 的回复:
都太高深了,为什么不能这么写啊,string.replace(" ","");要是我肯定就这么写了
对,你的比我上面写的好多了,replace 再 substring, 楼主还要可靠数据
渃水 2013-12-09
  • 打赏
  • 举报
回复
都太高深了,为什么不能这么写啊,string.replace(" ","");要是我肯定就这么写了
智商余额不足 2013-12-09
  • 打赏
  • 举报
回复
发现和上面的例子一样啊,还缺少了检验
智商余额不足 2013-12-09
  • 打赏
  • 举报
回复
没有考虑你数据有效性,只是从你问题的数据得出一组数据

static List<string> GetXXXXX(string str)
{
     List<string> result = new List<string>();
     char[] chs = new char[14];
     for (int i = 0, j = 0; i < str.Length; i++)
     {
         if (str[i] != ' ')
         {
             chs[j++] = str[i];
             if (j == 14)
             {
                  result.Add(new string(chs));
                  j = 0;
              }
          }
      }
     return result;
}
c02645 2013-12-09
  • 打赏
  • 举报
回复
引用 20 楼 qldsrx 的回复:
[quote=引用 16 楼 danding_ge 的回复:]都是学术讨论,不要吵架哈~
他是2b,没空理他,事实胜于雄辩,口角之争没任何意义,再说我也没义务纠正他的错误理解,帮他理解正确了对我也没有好处。[/quote] 我说扯蛋并不是骂人,只是无理头的意思,你这个才是骂人哦,再说了,你都没有能力写个能判断16进制的比正则快的,你说什么呢? 你21楼的也没有判断16进制啊。都没有符合题意,说什么呢? 题都没看清。
qldsrx 2013-12-09
  • 打赏
  • 举报
回复
突然想到一个最快的做法,只要一步即可,不需要去空格,还能确保空格以外的非法字符干扰:

        private List<string> Locate(string recv)
        {
            List<string> result = new List<string>();
            char[] tmp = new char[14];
            tmp[0] = '0';
            tmp[1] = '3';
            tmp[2] = '1';
            tmp[3] = '0';
            tmp[4] = '0';
            tmp[5] = '7';
            int i = 0;
            foreach (char a in recv)
            {
                //非16禁止字符直接丢弃
                if (a < 30 || a > 46)
                    continue;
                //判断前面6位是否为固定值,不是就重新判断
                if (i < 6)
                {
                    if (tmp[i] != a)
                        i = 0;
                    else
                        i++;
                }
                else
                {
                    tmp[i] = a;
                    if (i == 13)
                    {
                        result.Add(new string(tmp));
                        i = 0;
                    }
                    else
                        i++;
                }
            }
            return result;
        }
qldsrx 2013-12-09
  • 打赏
  • 举报
回复
代码重贴,犯了个小错误,忘记char的默认值不是'0'而是0x00了,字符0不是二进制的0
        private List<string> Locate(string recv)
        {
            recv = recv.Replace(" ", "");//如果有空白字符不是空格,例如0x00,0x01等不可显示字符,则需要用正则替换空白字符。
            List<string> result = new List<string>();
            char[] tmp = new char[14];
            tmp[0] = '0';
            tmp[1] = '3';
            tmp[2] = '1';
            tmp[3] = '0';
            tmp[4] = '0';
            tmp[5] = '7';
            int i = 0;
            foreach (char a in recv)
            {
                //判断前面6位是否为固定值,不是就重新判断
                if (i < 6)
                {
                    if (tmp[i] != a)
                        i = 0;
                    else
                        i++;
                }
                else
                {
                    tmp[i] = a;
                    if (i == 13)
                    {
                        result.Add(new string(tmp));
                        i = 0;
                    }
                    else
                        i++;
                }
            }
            return result;
        }
qldsrx 2013-12-09
  • 打赏
  • 举报
回复
引用 16 楼 danding_ge 的回复:
都是学术讨论,不要吵架哈~
他是2b,没空理他,事实胜于雄辩,口角之争没任何意义,再说我也没义务纠正他的错误理解,帮他理解正确了对我也没有好处。
qldsrx 2013-12-09
  • 打赏
  • 举报
回复
引用 13 楼 danding_ge 的回复:
哦哦 没有看到trim前导和尾部的字样。。。多谢了! 还有每次判断开头是否为031007怎么加?我自己写的方法该觉太麻烦了。
这要看你的数据异常情况是什么,以及是否做丢弃处理。 如果做丢弃处理,且必须是031007开头,则需要将循环修改下:
        private List<string> Locate(string recv)
        {
            recv = recv.Replace(" ", "");//如果有空白字符不是空格,例如0x00,0x01等不可显示字符,则需要用正则替换空白字符。
            List<string> result = new List<string>();
            char[] tmp = new char[14];
            tmp[1] = '3';
            tmp[2] = '1';
            tmp[5] = '7';
            int i = 0;
            foreach (char a in recv)
            {
                //判断前面6位是否为固定值,不是就重新判断
                if (i < 6)
                {
                    if (tmp[i] != a)
                        i = 0;
                    else
                        i++;
                }
                else
                {
                    tmp[i] = a;
                    if (i == 13)
                    {
                        result.Add(new string(tmp));
                        i = 0;
                    }
                    else
                        i++;
                }
            }
            return result;
        }
  • 打赏
  • 举报
回复
这个我没做过测试,所以没法给你结论,给你个网址 http://www.alixixi.com/program/a/2008020624159.shtml 有人用判断一字符串是否全由数字组成来测试循环和正则等一些方法的速度,这个测试目测是循环处理比较快。因为循环对于计算机处理来说最简单,单一、明确、有限。
c02645 2013-12-09
  • 打赏
  • 举报
回复


            string s = "031007FFFF0C10  031007FFFF0F11 031007FF030C10031007FFFF0C10    03  1007 FF FF0C10  031007FFFF0C10  03 10 07 FF 03 0C 10 031007FFFF0C10031007FFFF0C10 031007FFFF0F10031007FFFF0C10031007FF  030C10031007FF 030C10031007FFFF0C10   031007  FF FF 0C 1003   1007FF FF0C 10031007FFFF0F10 031007FFFF 0C10"
.Replace(" ","");
            MatchCollection mc=   Regex.Matches(s,@"031007[0-9A-F]{8,8}");
            foreach (Match m in mc)
            {
                Console.WriteLine(m.Value);
            }
按你的要求,正则是最快的了,别听他扯蛋,只是之前少替换了空格。
公西雒 2013-12-09
  • 打赏
  • 举报
回复
引用 15 楼 c02645 的回复:
引用 10 楼 qldsrx 的回复:
[quote=引用 8 楼 danding_ge 的回复:] [quote=引用 7 楼 c02645 的回复:] 你是不是想求正则,正则最快
正则最快吗?我不懂正则。。。听说正则拖速度啊。。。
正则最慢,而且这里没有正则出场的份额。那个正则写的东西压根就不对,不替换空格就没办法全部匹配到,包括后面9楼的也是,替换空格是必须的一步。 至于你说的trim和replace实现的功能不一样,如果能用trim实现自然是会考虑它,但是trim只能去掉首尾的空格,中间的无法去掉,达不到你想要的效果。[/quote] 居然说正则慢,你写一个16进制,8位字符串的判断方法给我看看,会比正则快? 都在扯蛋。[/quote]都是学术讨论,不要吵架哈~
c02645 2013-12-09
  • 打赏
  • 举报
回复
引用 10 楼 qldsrx 的回复:
引用 8 楼 danding_ge 的回复:
[quote=引用 7 楼 c02645 的回复:] 你是不是想求正则,正则最快
正则最快吗?我不懂正则。。。听说正则拖速度啊。。。
正则最慢,而且这里没有正则出场的份额。那个正则写的东西压根就不对,不替换空格就没办法全部匹配到,包括后面9楼的也是,替换空格是必须的一步。 至于你说的trim和replace实现的功能不一样,如果能用trim实现自然是会考虑它,但是trim只能去掉首尾的空格,中间的无法去掉,达不到你想要的效果。[/quote] 居然说正则慢,你写一个16进制,8位字符串的判断方法给我看看,会比正则快? 都在扯蛋。
公西雒 2013-12-09
  • 打赏
  • 举报
回复
引用 12 楼 c02645 的回复:
[quote=引用 8 楼 danding_ge 的回复:] [quote=引用 7 楼 c02645 的回复:]

string s = "031007FFFF0C10  031007FFFF0F11 031007FF030C10031007FFFF0C10    03  1007 FF FF0C10  031007FFFF0C10  03 10 07 FF 03 0C 10 031007FFFF0C10031007FFFF0C10 031007FFFF0F10031007FFFF0C10031007FF  030C10031007FF 030C10031007FFFF0C10   031007  FF FF 0C 1003   1007FF FF0C 10031007FFFF0F10 031007FFFF 0C10";
         MatchCollection mc=   Regex.Matches(s,@"03[\w]{7,7}");
            foreach (Match m in mc)
            {
                Console.WriteLine(m.Value);
            }
你是不是想求正则,正则最快
正则最快吗?我不懂正则。。。听说正则拖速度啊。。。[/quote] 那要看什么情况了,按你的字符串和你的要求,如果是用split,后面你还要for来判断长度,或者linq。 正则一次就能取出来了,而且这性能上是根本区分不出来的。[/quote]你和10#说的不一样啊!都不知道听谁的好。。。
公西雒 2013-12-09
  • 打赏
  • 举报
回复
引用 10 楼 qldsrx 的回复:
引用 8 楼 danding_ge 的回复:
[quote=引用 7 楼 c02645 的回复:] 你是不是想求正则,正则最快
正则最快吗?我不懂正则。。。听说正则拖速度啊。。。
正则最慢,而且这里没有正则出场的份额。那个正则写的东西压根就不对,不替换空格就没办法全部匹配到,包括后面9楼的也是,替换空格是必须的一步。 至于你说的trim和replace实现的功能不一样,如果能用trim实现自然是会考虑它,但是trim只能去掉首尾的空格,中间的无法去掉,达不到你想要的效果。[/quote]哦哦 没有看到trim前导和尾部的字样。。。多谢了! 还有每次判断开头是否为031007怎么加?我自己写的方法该觉太麻烦了。
        private string[] Locate(string recv)
        {
            string[] allrecv = new string[100];
            int len = 0;
            recv.Trim();
            char[] charrecv = recv.ToCharArray();

            for (int itra = 0; itra < recv.Length; itra++ )
            {
                try
                {
                    for (int jtra = 0; jtra < 6; jtra++ )
                    {
                        allrecv[len] += charrecv[itra + jtra];
                    }
                    if (allrecv[len] == "031007")
                    {
                        for (int jtra = 6; jtra < 14; jtra++ )
                        {
                            allrecv[len] += charrecv[itra + jtra];
                        }
                        len++;
                        itra = itra + 13;
                    }
                }
                catch (System.Exception)
                {
                	break;
                }
            }

            return allrecv;
        }
c02645 2013-12-09
  • 打赏
  • 举报
回复
引用 8 楼 danding_ge 的回复:
[quote=引用 7 楼 c02645 的回复:]

string s = "031007FFFF0C10  031007FFFF0F11 031007FF030C10031007FFFF0C10    03  1007 FF FF0C10  031007FFFF0C10  03 10 07 FF 03 0C 10 031007FFFF0C10031007FFFF0C10 031007FFFF0F10031007FFFF0C10031007FF  030C10031007FF 030C10031007FFFF0C10   031007  FF FF 0C 1003   1007FF FF0C 10031007FFFF0F10 031007FFFF 0C10";
         MatchCollection mc=   Regex.Matches(s,@"03[\w]{7,7}");
            foreach (Match m in mc)
            {
                Console.WriteLine(m.Value);
            }
你是不是想求正则,正则最快
正则最快吗?我不懂正则。。。听说正则拖速度啊。。。[/quote] 那要看什么情况了,按你的字符串和你的要求,如果是用split,后面你还要for来判断长度,或者linq。 正则一次就能取出来了,而且这性能上是根本区分不出来的。
公西雒 2013-12-09
  • 打赏
  • 举报
回复
引用 9 楼 c02645 的回复:
你想要的正则是,这是16进制正则 03[0-9a-fA-F]{14,14} 或者 [0-9a-fA-F]{18,18} 吧?
呃呃呃 真的最快吗?我可不是要方便。。。
加载更多回复(7)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧