rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » C#

C#在字节数组中查找子串

    C#的字符串是UNICODE字符组成的。但是在tcp通讯中接收到的却是byte[]。我们处理接收到的数据时不能把接收到的byte[]类型的数据直接转换成字符串的,因为可能通讯数据中含有多字节字符,但是我们只接收到了一部分,这时转换成字符串会出错的。

    通讯数据中通常含有帧头和帧尾,要识别出帧头帧尾,以保证接收到的数据的完整,我们需要直接查找byte[]类型的数据。

    但是可恶的c#没有提供给我们这种查找子串的函数,我们需要自己来实现。下面是一段代码,实现了在一个byte[]类型的数组中查找byte[]类型的子串。

        /// <summary>
        /// 在 s 中查找 pattern
        /// 如果找到,返回 pattern 在 s 中第一次出现的位置
        /// 如果没找到,返回 -1
        /// </summary>
        /// <param name="s">源字节数组</param>
        /// <param name="pattern">查找的字节数组</param>
        /// <param name="offset">开始查找的偏移位置</param>
        /// <returns>找到,返回索引。没找到,返回-1</returns>
        static int IndexOf(byte[] s, byte[] pattern, int offset)             if (s == null) return -1;
            if (pattern == null) return -1;
            if (s.Length == 0) return -1;
            if (pattern.Length == 0) return -1;
            if ((offset < s.GetLowerBound(0)) || (offset > s.GetUpperBound(0))) return -1;
            if ((s.Length - offset) < pattern.Length) return -1;

            int slen = s.Length;
            int plen = pattern.Length;

            int sbound = s.GetLowerBound(0);
            int pbound = pattern.GetLowerBound(0);
            for (int i = 0; i <= slen - plen - offset; i++)                 int j;
                for (j = 0; j < plen; j++)                     if (s[sbound + i + j + offset] != pattern[pbound + j]) break;                 if (j == plen) return (i + sbound + offset);             return -1;
        }

    如果你恰好使用了这段代码,并不幸发现了错误,请让我知道:)

    这段代码参照了csdn论坛microblue同学的一个回帖,在此表示感谢。参照位置:http://topic.csdn.net/u/20090218/10/f8a5db5f-8aef-49f3-85a8-26c499dca706.html 在51楼。

顶一下
(0)
踩一下
(0)