在byte數組中定位已知byte[]

来源:https://www.cnblogs.com/xuanhu/archive/2020/04/01/12616588.html
-Advertisement-
Play Games

有時可能會想要在byte數組中定位已知數組的位置(惡狠狠看了一眼某儀器文檔),以下代碼完成此功能: using System; using System.Collections.Generic; using System.Linq; namespace Hu { public class ByteM ...


有時可能會想要在byte數組中定位已知數組的位置(惡狠狠看了一眼某儀器文檔),以下代碼完成此功能:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Hu
{
    public class ByteMatch
    {
        /// <summary>
        /// 返回源序列中首個與指定匹配序列相同的子序列後的第一個位元組在源序列中的索引,沒有匹配返回-1
        /// </summary>
        /// <param name="source">源序列</param>
        /// <param name="match">匹配序列</param>
        /// <returns></returns>
        public static int IndexAfter(IEnumerable<byte> source, IEnumerable<byte> match)
        {
            if (null == source || null == match)
                throw new ArgumentNullException();

            if (false == source.Any() || false == match.Any())
                throw new ArgumentException("源序列與匹配序列都須包含數據");

            int sLen = source.Count(), mLen = match.Count();
            if (sLen < mLen)
                throw new ArgumentException("匹配序列長度大於源序列長度");

            bool matched = false;
            int idx = 0, offset = 0;
            var lst = source.ToList();
            while (sLen - offset >= mLen)
            {
                idx = lst.IndexOf(match.ElementAt(0), offset);

                if (-1 == idx)
                    break;

                if (sLen - idx >= mLen)
                {
                    matched = true;
                    for (int jdx = 1; jdx < mLen; jdx++)
                    {
                        if (source.ElementAt(idx + jdx) != match.ElementAt(jdx))
                        {
                            matched = false;
                            break;
                        }
                    }

                    if (false == matched)
                        offset = idx + 1;
                    else
                        break;
                }
                else
                    break;
            }

            return matched ? (idx + mLen) : -1;
        }
    }
}
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是小棧君,因為個人和工作的緣故,所以拖更了一點時間,但是關於拖更的內容小棧君會在後續的時間中補回來,還希望大家繼續支持和關註小棧君。當然,在國內疫情稍微減緩的情況下,小棧君在這裡也多說兩句,在非常時刻,我們應當保持警惕,清洗手,多通風,避免人群聚集,希望大家平安健康, 閑話不多說,我們直接 ...
  • 前文總結了NIO的內容,有了NIO的一些基礎之後,我們就可以來看下Netty。Netty是Java領域的高性能網路傳輸框架,RPC的技術核心就是網路傳輸和序列化,所以Netty給予了RPC在網路傳輸領域巨大的支持。 一個簡單的Netty代碼實現 網路傳輸基於的是TCP協議,所以會有服務端和客戶端之分 ...
  • "OpenWrite 博客群發" 第一步:前往 "七牛雲" 官方註冊賬號 第二步:在“個人中心”中完成賬號實名認證 第三步:添加對象存儲 第四步:輸入存儲空間名稱,並將訪問控制設置為“公開” 第五步:在密鑰管理中創建AccessKey和SecretKey 第六步:在openwrite的高級配置中,圖 ...
  • volatile是Java虛擬機提供的 輕量級 的同步機制(“乞丐版”的synchronized) 1. 保證可見性 2. 不保證原子性 3. 禁止指令重排 可見性 指當多個線程訪問同一個變數時,如果其中一個線程修改了這個變數的值,其他線程能夠立即看得到修改的值 驗證可見性demo: 結果: 不保證 ...
  • 1、一張表,裡面有 ID 自增主鍵,當 insert 了 17 條記錄之後,刪除了第 15,16,17 條記錄,再把 Mysql 重啟,再 insert 一條記錄,這條記錄的 ID 是 18 還是 15 ? (1)如果表的類型是 MyISAM,那麼是 18因為 MyISAM 表會把自增主鍵的最大 I ...
  • 1. 構造函數 1.1. 構造函數特征 與類相同名稱,不聲明返回值類型。 不能被static、final、synchronized、abstract、native修飾,不能有return語句。 1.2. 構造函數作用 創建對象,給對象進行初始化。 1.3. 構造函數分類 隱式無參構造器,顯示構造器。 ...
  • 摘要:本文實例講述了php非同步多線程swoole用法。分享給大家供大家參考。具體分析如下:swoole重新定義PHP語言的高性能網路通信框架,提供了PHP語言的非同步多線程服務,下麵的實例就可以證實這一功能。一般來說,Swoole提供了PHP語言的非同步多線程伺服器,非同步TCP/UDP網路客戶端,非同步M ...
  • 最近把一個Asp .net core 2.0的項目遷移到Asp .net core 3.1,項目啟動的時候直接報錯: 看意思是缺少了一個authorization的中間件,這個項目在Asp.net core 2.0上是沒問題的。 startup是這樣註冊的: 查了文檔後發現3.0的示例代碼多了一個U ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...