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

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

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

一、核心原理

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

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

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

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

表達(dá)式逐部分拆解

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

三、完整代碼示例

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

using System;

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

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

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

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

        // 需求4:提取 offset=1、bitIndex=3 的值(bytes[1]=0x12 → 二進(jìn)制 00010010)
        int offset4 = 1;
        int bitIndex4 = 3;
        bool bit4 = ExtractBitFromBytes(plcBytes, offset4, bitIndex4);
        Console.WriteLine($"字節(jié){offset4}的位{bitIndex4}值:{bit4}(對(duì)應(yīng)二進(jìn)制位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)
    {
        // 合法性校驗(yàn):防止數(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之間");

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

四、運(yùn)行結(jié)果說(shuō)明

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

plaintext

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

完全匹配二進(jìn)制位的實(shí)際值,驗(yàn)證了提取邏輯的正確性。

五、補(bǔ)充說(shuō)明

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

總結(jié)

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

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

相關(guān)文章

最新評(píng)論

西宁市| 涟水县| 江门市| 西峡县| 永丰县| 祁连县| 凤冈县| 蕉岭县| 杭州市| 天等县| 西吉县| 绥棱县| 资源县| 白河县| 克什克腾旗| 湛江市| 仙居县| 江西省| 类乌齐县| 霍州市| 周宁县| 永安市| 茌平县| 渭源县| 且末县| 漳州市| 徐汇区| 孝义市| 延长县| 水富县| 彭阳县| 华阴市| 西乌| 周口市| 延寿县| 浠水县| 社会| 安顺市| 平原县| 通渭县| 福清市|