YYProject.BytesSearch
1.0.0
dotnet add package YYProject.BytesSearch --version 1.0.0
NuGet\Install-Package YYProject.BytesSearch -Version 1.0.0
<PackageReference Include="YYProject.BytesSearch" Version="1.0.0" />
paket add YYProject.BytesSearch --version 1.0.0
#r "nuget: YYProject.BytesSearch, 1.0.0"
// Install YYProject.BytesSearch as a Cake Addin
#addin nuget:?package=YYProject.BytesSearch&version=1.0.0
// Install YYProject.BytesSearch as a Cake Tool
#tool nuget:?package=YYProject.BytesSearch&version=1.0.0
YYProject.BytesSearch
A pure C# library provides bytes searching capabilities supports wildcards.
Example
var source = new byte[] { 0, 1, 2, 3, 4, 5, 6, 0x17, };
int result;
//Found, result is 1.
result = BytesFinder.FindIndex(source, new byte[] { 1, 2, 3 });
result = new BytesFinder(new byte[] { 1, 2, 3 }).FindIndexIn(source);
//Not found, result is -1.
result = BytesFinder.FindIndex(source, new byte[] { 8, 9, 10 });
result = new BytesFinder(new byte[] { 8, 9, 10 }).FindIndexIn(source);
//Found, result is 1.
result = BytesFinder.FindIndex(source, "01 02 ?? 04");
result = new BytesFinder("01 02 ?? 04").FindIndexIn(source);
//Not found, result is -1.
result = BytesFinder.FindIndex(source, "01 02 ?? 03");
result = new BytesFinder("01 02 ?? 03").FindIndexIn(source);
//Found, result is 5.
result = BytesFinder.FindIndex(source, "05 06 ?7");
result = new BytesFinder("05 06 ?7").FindIndexIn(source);
//Found, result is 5.
result = BytesFinder.FindIndex(source, "05 06 1?");
result = new BytesFinder("05 06 1?").FindIndexIn(source);
//Not found, result is -1.
result = BytesFinder.FindIndex(source, "05 06 ?8");
result = BytesFinder.FindIndex(source, "05 06 2?");
//Found, result is 0.
result = BytesFinder.FindIndex(source, "?? ?? ?? ?? ?? ?? ?? ??");
//Not found, result is -1.
result = BytesFinder.FindIndex(source, "?? ?? ?? ?? ?? ?? ?? ?? ??");
Pattern Rules
- Any space character (0x20) should be ignored.
- A byte number must be expressed as two-digit hexadecimal number, excludes any prefix or postfix.
- Question mark (0x3F) represents wildcard. Wildcards must be in pairs, or it has a leading or trailing hexadecimal number.
"A102C3"
√
"A1 02 C3"
√
"A102 C3"
√
"A1 ?? C3"
√
"A1 ?2 C3"
√
"A1 0? C3"
√
"A1 2 C3"
×
"A1 02 195"
×
"A1 ? C3"
×
Speed Test
10byte ~ 16MB random data, a thousand times:
Debug: bytes pattern cost is 1309.7017 , string pattern cost is 948.357200000001 , wildcard string pattern cost is 32906.4641, Boyer Moore algorithm implementation is 1440.9692
Release: bytes pattern cost is 676.126699999998 , string pattern cost is 608.047799999999 , wildcard string pattern cost is 14577.6418, Boyer Moore algorithm implementation is 929.0357
P.S: BM implementation that I have used is here. But notice that you should move these code to constructor, or this BM impl would be very slow:
ComputeLast();
ComputeMatch();
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp1.0 was computed. netcoreapp1.1 was computed. netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard1.3 is compatible. netstandard1.4 was computed. netstandard1.5 was computed. netstandard1.6 was computed. netstandard2.0 was computed. netstandard2.1 was computed. |
.NET Framework | net46 was computed. net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen30 was computed. tizen40 was computed. tizen60 was computed. |
Universal Windows Platform | uap was computed. uap10.0 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 1.3
- NETStandard.Library (>= 1.6.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.0 | 491 | 10/10/2019 |