最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#讀取字節(jié)數(shù)組某個位的值的具體實現(xiàn)方法

 更新時間:2026年01月04日 09:40:34   作者:工業(yè)程序猿老趙  
字節(jié)數(shù)組中提取指定偏移量字節(jié)的指定位的值(對應(yīng) PLC 中 1 個字節(jié)對應(yīng) 8 個布爾值的場景,如 I0.0~I0.7 對應(yīng) 1 個字節(jié)的 bit0~bit7),核心是通過位運算實現(xiàn),下面詳細講解具體方法和實現(xiàn),需要的朋友可以參考下

一、核心原理

  1. 先通過 bytes[offset] 獲取字節(jié)數(shù)組中指定偏移量(offset)的單個字節(jié)(對應(yīng) PLC 中的 1 個字節(jié)地址);
  2. 再通過 按位與(& 運算 + 位左移(<< 運算,提取該字節(jié)中指定位(bitIndex,范圍 0~7,0 表示最低位 / 最右邊,7 表示最高位 / 最左邊)的值;
  3. 判定規(guī)則:運算結(jié)果非 0 表示該位為 1(對應(yīng) C# true),運算結(jié)果為 0 表示該位為 0(對應(yīng) C# false)。

二、關(guān)鍵表達式(提取單個位的值)

這是提取指定位的核心代碼,直接可復用:

// 核心表達式:提取 bytes 數(shù)組中 offset 偏移量字節(jié)的 bitIndex 位的值
bool bitValue = (bytes[offset] & (1 << bitIndex)) != 0;

表達式逐部分拆解

部分含義說明
bitIndex要提取的位索引,范圍 0~7(必須滿足 0 ≤ bitIndex ≤ 7,否則會出錯)
1 << bitIndex把數(shù)字 1 左移 bitIndex 位,生成一個 “僅目標位為 1,其余位為 0” 的掩碼(例如 bitIndex=2 時,1<<2=4,對應(yīng)二進制 00000100
bytes[offset] & (1 << bitIndex)按位與運算:只有 “目標位同時為 1” 時,結(jié)果才非 0,其余情況結(jié)果為 0(精準篩選目標位的值)
!= 0將位運算結(jié)果轉(zhuǎn)換為 C# 布爾值:非 0 → true(位值為 1),0 → false(位值為 0)

三、完整代碼示例

下面提供可直接運行的 C# 代碼,包含字節(jié)數(shù)組定義、位提取方法、場景演示:

using System;

class PlcBitExtraction
{
    static void Main(string[] args)
    {
        // 示例:從 PLC 讀取的字節(jié)數(shù)組(假設(shè) bytes[0] = 0x05,對應(yīng)二進制 00000101)
        byte[] plcBytes = new byte[] { 0x05, 0x12, 0x34 };

        // 需求1:提取 offset=0(第1個字節(jié))、bitIndex=0(最低位)的值
        int offset1 = 0;
        int bitIndex1 = 0;
        bool bit1 = ExtractBitFromBytes(plcBytes, offset1, bitIndex1);
        Console.WriteLine($"字節(jié){offset1}的位{bitIndex1}值:{bit1}(對應(yīng)二進制位1)");

        // 需求2:提取 offset=0、bitIndex=1 的值
        int bitIndex2 = 1;
        bool bit2 = ExtractBitFromBytes(plcBytes, offset1, bitIndex2);
        Console.WriteLine($"字節(jié){offset1}的位{bitIndex2}值:{bit2}(對應(yīng)二進制位0)");

        // 需求3:提取 offset=0、bitIndex=2 的值
        int bitIndex3 = 2;
        bool bit3 = ExtractBitFromBytes(plcBytes, offset1, bitIndex3);
        Console.WriteLine($"字節(jié){offset1}的位{bitIndex3}值:{bit3}(對應(yīng)二進制位1)");

        // 需求4:提取 offset=1、bitIndex=3 的值(bytes[1]=0x12 → 二進制 00010010)
        int offset4 = 1;
        int bitIndex4 = 3;
        bool bit4 = ExtractBitFromBytes(plcBytes, offset4, bitIndex4);
        Console.WriteLine($"字節(jié){offset4}的位{bitIndex4}值:{bit4}(對應(yīng)二進制位1)");
    }

    /// <summary>
    /// 從字節(jié)數(shù)組中提取指定偏移量、指定位索引的位值
    /// </summary>
    /// <param name="bytes">原始字節(jié)數(shù)組(從 PLC 讀取的字節(jié)流)</param>
    /// <param name="offset">字節(jié)偏移量(數(shù)組索引,從0開始)</param>
    /// <param name="bitIndex">位索引(0~7,0=最低位,7=最高位)</param>
    /// <returns>位值(true=1,false=0)</returns>
    static bool ExtractBitFromBytes(byte[] bytes, int offset, int bitIndex)
    {
        // 合法性校驗:防止數(shù)組越界和位索引超出范圍
        if (bytes == null)
            throw new ArgumentNullException(nameof(bytes), "字節(jié)數(shù)組不能為null");
        if (offset < 0 || offset >= bytes.Length)
            throw new ArgumentOutOfRangeException(nameof(offset), "字節(jié)偏移量超出數(shù)組范圍");
        if (bitIndex < 0 || bitIndex > 7)
            throw new ArgumentOutOfRangeException(nameof(bitIndex), "位索引必須在0~7之間");

        // 核心:位運算提取指定位
        byte targetByte = bytes[offset]; // 獲取指定偏移量的字節(jié)
        int mask = 1 << bitIndex;        // 生成位掩碼
        return (targetByte & mask) != 0; // 按位與運算,判定位值
    }
}

四、運行結(jié)果說明

上述代碼中,plcBytes[0] = 0x05(十六進制)→ 對應(yīng)二進制 00000101,運行后輸出:

plaintext

字節(jié)0的位0值:True(對應(yīng)二進制位1)
字節(jié)0的位1值:False(對應(yīng)二進制位0)
字節(jié)0的位2值:True(對應(yīng)二進制位1)
字節(jié)1的位3值:True(對應(yīng)二進制位1)

完全匹配二進制位的實際值,驗證了提取邏輯的正確性。

五、補充說明

  1. 位索引順序:PLC 中常用的位編號(如 I0.0、I0.1)通常對應(yīng) bitIndex=0、bitIndex=1,與上述代碼的位索引一致;
  2. 批量提取:若需提取 1 個字節(jié)對應(yīng)的 8 個位,可通過循環(huán) bitIndex 從 0 到 7 依次調(diào)用提取方法;
  3. PLC 場景適配:該方法完全適配 Sharp7、S7NetPlus 等主流 PLC 通信庫,可直接集成到 PLC 數(shù)據(jù)讀取業(yè)務(wù)中。

總結(jié)

  1. 核心表達式:(bytes[offset] & (1 << bitIndex)) != 0(快速提取指定位的值);
  2. 關(guān)鍵運算:按位與(&)用于篩選目標位,位左移(<<)用于生成位掩碼;
  3. 位索引范圍:0~7(0 最低位,7 最高位),偏移量 offset 為字節(jié)數(shù)組的索引;
  4. 實際使用時需增加合法性校驗,避免數(shù)組越界和無效位索引。

到此這篇關(guān)于C#讀取字節(jié)數(shù)組某個位的值的具體實現(xiàn)方法的文章就介紹到這了,更多相關(guān)C#讀取字節(jié)數(shù)組某個位的值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

宁津县| 徐州市| 肥城市| 乐陵市| 梅州市| 阆中市| 清徐县| 礼泉县| 安远县| 黔西| 利川市| 页游| 彰化县| 青铜峡市| 且末县| 泸溪县| 乐至县| 镇宁| 西贡区| 漳平市| 吉木萨尔县| 德惠市| 临海市| 桓仁| 特克斯县| 宜城市| 通州区| 渝中区| 信阳市| 宝兴县| 准格尔旗| 晋中市| 临潭县| 中超| 金湖县| 炎陵县| 金堂县| 鹿泉市| 盖州市| 上栗县| 磴口县|