当前位置: 首页 > news >正文

C#读取字节数组某个位的值的具体实现方法

一、核心原理先通过bytes[offset]获取字节数组中指定偏移量offset的单个字节对应 PLC 中的 1 个字节地址再通过按位与运算 位左移运算提取该字节中指定位bitIndex范围 0~70 表示最低位 / 最右边7 表示最高位 / 最左边的值判定规则运算结果非 0 表示该位为 1对应 C#true运算结果为 0 表示该位为 0对应 C#false。二、关键表达式提取单个位的值这是提取指定位的核心代码直接可复用12// 核心表达式提取 bytes 数组中 offset 偏移量字节的 bitIndex 位的值boolbitValue (bytes[offset] (1 bitIndex)) ! 0;表达式逐部分拆解部分含义说明bitIndex要提取的位索引范围 0~7必须满足0 ≤ bitIndex ≤ 7否则会出错1 bitIndex把数字 1 左移bitIndex位生成一个 “仅目标位为 1其余位为 0” 的掩码例如bitIndex2时124对应二进制00000100bytes[offset] (1 bitIndex)按位与运算只有 “目标位同时为 1” 时结果才非 0其余情况结果为 0精准筛选目标位的值! 0将位运算结果转换为 C# 布尔值非 0 →true位值为 10 →false位值为 0三、完整代码示例下面提供可直接运行的 C# 代码包含字节数组定义、位提取方法、场景演示12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455usingSystem;classPlcBitExtraction{staticvoidMain(string[] args){// 示例从 PLC 读取的字节数组假设 bytes[0] 0x05对应二进制 00000101byte[] plcBytes newbyte[] { 0x05, 0x12, 0x34 };// 需求1提取 offset0第1个字节、bitIndex0最低位的值intoffset1 0;intbitIndex1 0;boolbit1 ExtractBitFromBytes(plcBytes, offset1, bitIndex1);Console.WriteLine($字节{offset1}的位{bitIndex1}值{bit1}对应二进制位1);// 需求2提取 offset0、bitIndex1 的值intbitIndex2 1;boolbit2 ExtractBitFromBytes(plcBytes, offset1, bitIndex2);Console.WriteLine($字节{offset1}的位{bitIndex2}值{bit2}对应二进制位0);// 需求3提取 offset0、bitIndex2 的值intbitIndex3 2;boolbit3 ExtractBitFromBytes(plcBytes, offset1, bitIndex3);Console.WriteLine($字节{offset1}的位{bitIndex3}值{bit3}对应二进制位1);// 需求4提取 offset1、bitIndex3 的值bytes[1]0x12 → 二进制 00010010intoffset4 1;intbitIndex4 3;boolbit4 ExtractBitFromBytes(plcBytes, offset4, bitIndex4);Console.WriteLine($字节{offset4}的位{bitIndex4}值{bit4}对应二进制位1);}/// summary/// 从字节数组中提取指定偏移量、指定位索引的位值/// /summary/// param namebytes原始字节数组从 PLC 读取的字节流/param/// param nameoffset字节偏移量数组索引从0开始/param/// param namebitIndex位索引0~70最低位7最高位/param/// returns位值true1false0/returnsstaticboolExtractBitFromBytes(byte[] bytes,intoffset,intbitIndex){// 合法性校验防止数组越界和位索引超出范围if(bytes null)thrownewArgumentNullException(nameof(bytes),字节数组不能为null);if(offset 0 || offset bytes.Length)thrownewArgumentOutOfRangeException(nameof(offset),字节偏移量超出数组范围);if(bitIndex 0 || bitIndex 7)thrownewArgumentOutOfRangeException(nameof(bitIndex),位索引必须在0~7之间);// 核心位运算提取指定位bytetargetByte bytes[offset];// 获取指定偏移量的字节intmask 1 bitIndex;// 生成位掩码return(targetByte mask) ! 0;// 按位与运算判定位值}}四、运行结果说明上述代码中plcBytes[0] 0x05十六进制→ 对应二进制00000101运行后输出plaintext1234字节0的位0值True对应二进制位1字节0的位1值False对应二进制位0字节0的位2值True对应二进制位1字节1的位3值True对应二进制位1完全匹配二进制位的实际值验证了提取逻辑的正确性。五、补充说明位索引顺序PLC 中常用的位编号如 I0.0、I0.1通常对应bitIndex0、bitIndex1与上述代码的位索引一致批量提取若需提取 1 个字节对应的 8 个位可通过循环bitIndex从 0 到 7 依次调用提取方法PLC 场景适配该方法完全适配 Sharp7、S7NetPlus 等主流 PLC 通信库可直接集成到 PLC 数据读取业务中。总结核心表达式(bytes[offset] (1 bitIndex)) ! 0快速提取指定位的值关键运算按位与用于筛选目标位位左移用于生成位掩码位索引范围0~70 最低位7 最高位偏移量offset为字节数组的索引实际使用时需增加合法性校验避免数组越界和无效位索引。
http://www.zskr.cn/news/1364086.html

相关文章:

  • vC#控制反转的使用详解
  • 服务器被入侵后如何应急响应:安全运维实战指南
  • 别再死磕矩阵求逆了!用Python的NumPy和SciPy搞定伪逆矩阵(pseudo-inverse)实战
  • Kerr相干态:从非线性量子光学到光子晶格模拟的实现路径
  • 机器学习辅助砌体结构均质化:从虚拟实验室到高效损伤本构模型
  • ML/MM混合方法在药物结合自由能计算中的基准评估与实战指南
  • 战略分类:当机器学习遭遇策略性操纵与未知图结构
  • 深度强化学习在VLSI布局优化中的应用与优化
  • 基于半监督学习的海洋异常检测技术解析
  • Trivy实战:Docker镜像漏洞扫描与CI/CD安全门禁集成
  • 结构可辨识性映射:提升小样本时间序列分类性能的机理驱动方法
  • 小样本下机器学习模型性能稳定性评估:分位数与置信区间实战
  • Windows 11 + WSL2 保姆级教程:手把手带你部署网易有道QAnything本地知识库
  • ARM Cortex-A76核心电源管理原理与实践
  • Android HTTPS抓包失败根源:系统证书信任链详解
  • VAE-TCN时间序列分析:从架构稳定性到复杂模式挖掘
  • 机器学习赋能高维量子导引检测:从SVM到ANN的实践探索
  • 随机森林回归与PISO算法融合:实现CFD在线模型修正与状态估计
  • 量子机器学习采样加速:热力学视角下的双向量子制冷器
  • 【芯片测试】:7. Action 与 Operating Sequence
  • 机器学习势函数与元动力学模拟:揭示电催化水分解的原子尺度反应机理
  • 基于Petri网与机器学习的等离子体化学反应网络简化方法
  • 年薪50万必备技能:.NET云原生架构实战,3分钟部署全球可用的微服务
  • Harness Engineering:麻绳还是马绳
  • 高维数据压缩:秩-1格点与双曲交叉方法原理与应用
  • Claude Code-入门篇-Claude-Code基础与环境配置
  • 基于图元随机游走的网络嵌入:提升同质性与下游任务性能
  • 告别Python踩坑:用ioapi的m3mask工具5分钟搞定CMAQ-ISAM区域文件(附int转float关键一步)
  • 量子机器学习数据集构建:从核心要素到工程实践
  • 经典通信赋能分布式量子机器学习:NISQ时代的实用化路径探索