zoukankan      html  css  js  c++  java
  • Python读字节某一位的值,设置某一位的值,二进制位操作

    Python读字节某一位的值,设置某一位的值,二进制位操作

      在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把0和1、True和False、Yes和No这样的布尔值每8个只占用一个字节,用字节中的位来表示。减少传输量,减少对网络稳定性的要求。这就带来了要怎么读某个字节中每一位的值和怎么设置每一位的值的问题。

      这几天再写培训演示代码,顺便就写了两个函数,解决字节位值读写问题,现在分享给大家。

      下面直接上代码,在Python3上测试通过:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    def get_bit_val(byte, index):
        """
        得到某个字节中某一位(Bit)的值
    
        :param byte: 待取值的字节值
        :param index: 待读取位的序号,从右向左0开始,0-7为一个完整字节的8个位
        :returns: 返回读取该位的值,0或1
        """
        if byte & (1 << index):
            return 1
        else:
            return 0
    
    
    def set_bit_val(byte, index, val):
        """
        更改某个字节中某一位(Bit)的值
    
        :param byte: 准备更改的字节原值
        :param index: 待更改位的序号,从右向左0开始,0-7为一个完整字节的8个位
        :param val: 目标位预更改的值,0或1
        :returns: 返回更改后字节的值
        """
        if val:
            return byte | (1 << index)
        else:
            return byte & ~(1 << index)
    
    
    print(get_bit_val(3, 2))        # 3的2进制00000 0 11,2号位是0,打印结果0
    print(get_bit_val(3, 1))        # 3的2进制000000 1 1,1号位是1,打印结果1
    print(get_bit_val(3, 5))        # 3的2进制00 0 00011,5号位是0,打印结果0
    
    print(set_bit_val(3, 2, 1))     # 3的2进制00000 0 11,2号位改成1,打印结果7(00000111)
    print(set_bit_val(3, 1, 0))     # 3的2进制000000 1 1,1号位改成0,打印结果1(00000001)
    print(set_bit_val(3, 5, 0))     # 3的2进制00 0 00011,5号位改成0,打印结果3(00000011)
    
    
    """
    控制台输出:
    0
    1
    0
    7
    1
    3
    """
    
    
  • 相关阅读:
    webservice时间类型XMLGregorianCalendar和Date的转换
    webservice中jaxws:server 和jaxws:endpoint的区别
    使用CXF开发JAX-WS类型的WebService
    使用TCP/IP Monitor监视Soap协议
    Webservice优缺点总结
    WebService两种调用方法
    DOS命令运行java文件,批量引用jar包
    eclipse创建的maven项目无法部署到tomcat
    图片翻转效果
    掷骰子效果
  • 原文地址:https://www.cnblogs.com/xueweisuoyong/p/11874444.html
Copyright © 2011-2022 走看看