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楼。