【问题标题】:How read bits in 64 bit data put into corresponding bitfields in python如何将 64 位数据中的读取位放入 python 中的相应位域
【发布时间】:2015-08-20 22:05:47
【问题描述】:

我想读取64位数据中的位放入Register类的相应位域中,我不想使用位数组模块,python中有没有传统的方法来实现这一点。

我研究了这个主题,我得到了以下链接 - [1]:How to read bits from a file? [位字段读取链接][1] 但它没有帮助,示例代码 sn-p 非常感谢。提前致谢.

class Register(object):
    def __init__(self, x): 

       self.BitField7= 0
       self.BitField6= 0
       self.BitField5= 0
       self.BitField4= 0
       self.BitField3= 0
       self.BitField2= 0
       self.BitField1= 0

       self.fieldwidths = (6,12,6,4,12,8,16)
       self.field_names=["BitField1","BitField2","BitField3","BitField4","BitField5","BitField6","BitField7"]

obj= Register('0b11011101110111011101110111011101110011001100110011001100110011001011101110111011101110111011101110101010101010101010101010101010') # input is 0xAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD

print obj # should print 0xAAAAAAAABBBBBBBB

提前致谢

【问题讨论】:

  • 通常您会定义一个通用寄存器类,然后为每个寄存器定义子类或实例中的不同值。这似乎被硬编码为一组特定的值。你到底想完成什么?
  • @Patrick Maupin 我想要基于我想要分割输入的输入,因为我已经知道 feildwidths 例如:input/self.fieldwidths = (6,12,6,4,12,8,16 ), 切片后我想把它放到相应的位域中
  • 您的字段是 MSB 在前还是 LSB 在前?为什么你希望按那个顺序打印? AAAA 在您号码的底部...
  • @Patrick Maupin 字段顺序是 LSB 在 MSB 之前,AAAA 在数字的 MSB 之前。期待您的宝贵回复
  • 您能给我们举个例子,说明您输入的 BitFields 的值应该是什么?

标签: python bit-manipulation byte bit


【解决方案1】:

以下代码会将二进制数的请求部分加载到字段中:

class Register(object):
    def __init__(self,x):
        self.fieldwidths = [6,12,6,4,12,8,16]

        ## Reverse the input string then convert it to an integer
        x = int(x[2:][::-1],2)   

        ## To keep code size down, store fields in a list (+ laziness)
        ## [BitField1, BitField2, ...,BitField7]
        self.fields = [0,0,0,0,0,0,0]

        for i,width in enumerate(self.fieldwidths):
            ## You can change the variables this stores the values in to
            ## your liking, but this is the basic procedure

            ## Store the last "width" number of bits in the current field
            ## e.g. 0b1000101 & 0b111 (or (2**3)-1) yields 0b101
            self.fields[i] = x & ((2**width)-1)

            ## Chop off the last "width" number of bits from x
            ## e.g. 0b1010 >> 1 would result in 0b101
            x = x >> width

obj = Register('0b11011101110111011101110111011101110011001100110011001100110011001011101110111011101110111011101110101010101010101010101010101010')

这将导致:

BitField1 = 0b111011
BitField2 = 0b111011101110
BitField3 = 0b101110
BitField4 = 0b1011
BitField5 = 0b1100111011
BitField6 = 0b110011
BitField7 = 0b11001100110011

结果可能不是您想要的,因为您提供的数据不是 64 位而是 128 位,这意味着程序将忽略输入数据的 64 位最高有效位。

编辑:

如果您只想硬编码变量名称和字段宽度,您可以展开 for 循环并分配变量:

class Register(object):
    def __init__(self,x):
        ## Reverse the input string then convert it to an integer
        x = int(x[2:][::-1],2)

        self.Bitfield1 = x & ((2**6)-1)
        x = x >> 6

        self.Bitfield2 = x & ((2**12)-1)
        x = x >> 12

        self.Bitfield3 = x & ((2**6)-1)
        x = x >> 6

        self.Bitfield4 = x & ((2**4)-1)
        x = x >> 4

        self.Bitfield5 = x & ((2**12)-1)
        x = x >> 12

        self.Bitfield6 = x & ((2**8)-1)
        x = x >> 8

        self.Bitfield7 = x & ((2**16)-1)

obj = Register('0b11011101110111011101110111011101110011001100110011001100110011001011101110111011101110111011101110101010101010101010101010101010')

【讨论】:

  • 非常感谢!!实际的字段宽度名称是 self.BitField7= 0 self.MO = 0 self.SI = 0 self.MI = 0 self.SO = 0 self.CLK = 0 self.DT = 0 self.RES = 0 为了简化我已经给出了这些名称 BitField0..7 你能告诉我如何使用上面给定的位域名称来实现
  • 您可以根据需要将变量分配给“self.fields”变量中的值,但我不确定如何将您提供的字段宽度的 7 个值分配给您提供的 8 个变量想要。
  • “您可以根据需要将变量分配给“self.fields”变量中的值”,请您详细说明一下,非常感谢任何代码sn-p
  • 你能告诉我,我怎么能用这些输入来实现 --- self.MO = 0 self.SI = 0 self.MI = 0 self.SO = 0 self.CLK = 0 self .DT = 0 self.RES = 0
  • 这些字段如何与您指定的位字段匹配? (即是 self.MO Bitfield1 还是 Bitfield7)
猜你喜欢
  • 2021-07-24
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
相关资源
最近更新 更多