在 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);
-----
技术支持:www.iqingcao.com 转载请保留!
分享到:
相关推荐
在Java编程语言中,字符串(String)是一个非常基础且重要的数据类型。它被广泛用于处理文本信息,例如用户输入、文件内容、网络数据等。本文将深入探讨Java中的字符串概念、特性以及常见操作。 首先,Java中的字符串...
首先创建FileWriter实例,然后调用`write()`方法写入字符串,最后调用`flush()`和`close()`方法确保数据写入并释放资源。 - 清单2展示了使用FileReader读取文件内容并打印。创建FileReader实例,通过循环调用`read...
首先创建一个新的字符串对象`out_str`,然后通过`IndexOf('\0', 0)`查找字符串中的空字符(通常是字符串结束标志),如果找不到则默认返回前16个字符。 #### 3. 字节数组转换为字符串 ```csharp public static ...
在字符串中查找指定字符时,可以先将字符串显示在richTextBox 控件中,然后利用richTextBox 类的Find 方法在该控件中查找指定字符。在字符串中查找指定字符的代码如下: 第19章 加密与解密技术 833 M_int_index = ...
- **字符流写入**:使用 `FileWriter` 可以将字符串写入到文件中。例如: ```java FileWriter fw = null; try { fw = new FileWriter("Test.txt"); fw.write("text"); } catch (IOException e) { System.out...
- `indexOf()`:查找子字符串在原字符串中的首次出现位置。 11. 抽象类与抽象方法: - 抽象类不一定包含抽象方法,但包含抽象方法的类必须声明为抽象类。 - 抽象类不能被实例化,只能被继承。 12. 普通类与抽象...
IO流分为四类:字节流(Byte Stream)、字符流(Character Stream)、对象流(Object Stream)和套接字流(Socket Stream)。字节流处理原始字节数据,而字符流处理Unicode字符集中的字符。对象流允许序列化和反序列...
Java 中的 IO 流分为四类:字节流(Byte Stream)、字符流(Character Stream)、输入流(Input Stream)和输出流(Output Stream)。其中,字节流处理单个字节,字符流处理 Unicode 字符。输入流负责读取数据,输出...
包括indexOf()用于查找子串位置,charAt()获取指定位置字符,replace()替换子串,toLowerCase()和toUpperCase()转换大小写,substring()截取子串,trim()去除空白,split()分割字符串,getBytes()获取字节数组,...
3. VFP中的ATC函数:VFP(Visual FoxPro)中的ATC函数用于查找子字符串在主字符串中的位置,如果找到,返回子字符串的第一个字符的位置;如果没有找到,返回0。在本例中,"管理"在"数据库管理系统"中的位置是7,所以...
总结,了解和熟练掌握VC中的数据类型及其转换是编程中的基本功,特别是涉及到字符串操作时,如CString的使用,能够提高代码的效率和可读性。在实际编程中,应根据具体需求选择合适的数据类型,并正确地进行类型间的...
在实际开发中,使用MongoDB.NET驱动进行GridFS操作时,需要确保MongoDB服务已经启动,且配置的连接字符串正确。此外,需要注意的是,GridFS虽然适合存储大文件,但并不适用于频繁的小文件操作,因为它有一定的开销。...
这里主要涉及两种类型的流:字节流(Byte Stream)和字符流(Character Stream)。对于文本文件,我们通常选择字符流,因为它能更好地处理字符编码问题。Java中,`BufferedReader`和`FileReader`是常用的字符流类,...
在Excel中使用VBA(Visual Basic for Applications)解码BASE64编码的图片是...在实际项目中,你可能需要根据具体需求调整和扩展这些基础代码,例如处理多个图片、自动查找和替换BASE64字符串,或者与用户界面交互等。
Guava的Strings类提供了多种字符串处理方法,如joining()用于连接字符串数组,commonSuffix()和commonPrefix()用于查找字符串的公共前缀或后缀。 5. **并发库** Guava提供了强大的并发工具,如ListenableFuture、...
- `replace()`:替换字符串中的某个子串。 - `trim()`:去除字符串首尾的空白字符。 - `split()`:根据分隔符将字符串分割成多个子串,返回一个字符串数组。 以上只是Java面试中的一部分核心知识点,实际上Java...
- `Collectors.joining(CharSequence delimiter)`: 在流操作中合并字符串,如`list.stream().collect(Collectors.joining(","))`。 以上就是Java中字符串操作的基础知识点,`StringOperator1`项目可能通过实例代码...
18. Java的IO流分为字节流(Byte Stream)和字符流(Character Stream),分别处理字节和字符数据。 19. 当打开一个结构复合索引的数据表时,记录的顺序将保持原顺序,除非指定特定的索引进行排序。 20. C语言程序...