在 stream流 和 byte[] 中查找(搜索)指定字符串

it2022-05-05  72

在 stream流 和 byte[] 中查找(搜索)指定字符串

这里注重看的是两个 Search 的扩展方法,一个是 stream 类型的扩展,另一个是 byte[] 类型的扩展,

如果大家有更好的“算法”,请给回复,我们一起优化!

 

-- 常用扩展代码,需要这部分代码的支持!

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Drawing;

namespace Ims.Bll {   /// <summary>   /// stream 、 string 、byte[] 间的转换扩展方法类   /// </summary>   public static class StreamExtend   {     #region Stream 扩展     /// <summary>     /// Stream Stream 转换为 byte 数组     /// </summary>     /// <returns></returns>     public static byte[] ToByteArray(this Stream stream)     {       byte[] bytes = new byte[stream.Length];       stream.Read(bytes, 0, bytes.Length);       // 设置当前流的位置为流的开始       stream.Seek(0, SeekOrigin.Begin);       return bytes;     }     /// <summary>     /// Stream 转换为 image 图片     /// </summary>     /// <returns></returns>     public static Image ToImage(this Stream stream)     {       Image img = new Bitmap(stream);       return img;     }     /// <summary>     /// Stream 转换为 string ,使用 Encoding.Default 编码     /// </summary>     /// <returns></returns>     public static string ToStr(this Stream stream)     {       return System.Text.Encoding.Default.GetString(stream.ToByteArray());     }     /// <summary>     /// 在当前流中搜索指定的 byte[]     /// </summary>     /// <param name="arr"></param>     /// <param name="key">搜索关键字</param>     /// <param name="beginPosition">搜索开始位置</param>     /// <returns>如果存在则返回byte[]在流中首次出现的位置,否则返回 -1</returns>     public static long Search(this Stream stream, long beginPosition, byte[] key)     {       if (stream == null || stream.Length <= beginPosition)         return -1;

      if (key == null || stream.Length < key.Length)         return -1;

      long i=-1;       long j = -1;       int currentByte = int.MinValue;       for(i=beginPosition;i<stream.Length;i++)       {         if (stream.Length < key.Length + i)           break;

        stream.Seek(i, SeekOrigin.Begin);         for (j = 0; j < key.Length; j++)         {           currentByte = stream.ReadByte();           if (currentByte != key[j])             break;         }         if (j == key.Length)           return i;

        if(currentByte == -1)           break;       }       return -1;     }     #endregion

    #region byte[] 扩展     /// <summary>     /// byte[] 转换为 stream 流     /// </summary>     /// <returns></returns>     public static Stream ToStream(this byte[] arr)     {       Stream stream = new MemoryStream(arr);       // 设置当前流的位置为流的开始       stream.Seek(0, SeekOrigin.Begin);       return stream;     }     /// <summary>     /// byte[] 转换为 Image     /// </summary>     /// <returns></returns>     public static Image ToImage(this byte[] arr)     {       return Image.FromStream(arr.ToStream());     }     /// <summary>     /// 转换为 string,使用 Encoding.Default 编码     /// </summary>     /// <returns></returns>     public static string ToStr(this byte[] arr)     {       return System.Text.Encoding.Default.GetString(arr);     }     /// <summary>     /// 搜索     /// </summary>     /// <param name="arr"></param>     /// <param name="key">搜索关键字</param>     /// <param name="beginPos">搜索开始位置</param>     /// <returns></returns>     public static int Search(this byte[] arr, int beginPosition, byte[] key)     {       if (arr == null || arr.Length <= beginPosition)         return -1;

      if (key == null || arr.Length < key.Length)         return -1;

      int i = -1;       int j = -1;       for (i = beginPosition; i < arr.Length; i++)       {         if (arr.Length < key.Length + i)           break;

        for (j = 0; j < key.Length; j++)         {           if (arr[i+j] != key[j])             break;         }         if (j == key.Length)           return i;       }       return -1;     }     #endregion

    #region string 扩展     /// <summary>     /// string 转换为 byte[]     /// </summary>     /// <returns></returns>     public static byte[] ToByteArray(this string str)     {       return System.Text.Encoding.Default.GetBytes(str);     }     /// <summary>     /// string 转换为 Stream     /// </summary>     /// <returns></returns>     public static Stream ToStream(this string str)     {       Stream stream = new MemoryStream(str.ToByteArray());       // 设置当前流的位置为流的开始       stream.Seek(0, SeekOrigin.Begin);       return stream;     }     #endregion   } }

 

------------------------

-- 测试脚本

      byte[] arr = "0123456789111".ToByteArray();       byte[] key1 = "123".ToByteArray();       byte[] key2 = "678".ToByteArray();       byte[] key3 = "911".ToByteArray();       byte[] key4 = "111".ToByteArray();       //流内搜索测试       Stream sm = arr.ToStream();       long index1 = sm.Search(0, key1);       long index2 = sm.Search(0, key2);       long index3 = sm.Search(0, key3);       long index4 = sm.Search(0, key4);       //byte[]内搜索测试       long index10 = arr.Search(0, key1);       long index20 = arr.Search(0, key2);       long index30 = arr.Search(0, key3);       long index40 = arr.Search(0, key4);

-----

技术支持:http://blog.csdn.net/xxj_jing

转载于:https://www.cnblogs.com/xxj-jing/archive/2012/04/26/2890072.html


最新回复(0)