将时间打包到位域

时间:2017-05-07 20:11:09

标签: python bit-fields

我需要将当前时间打包到限制性位模式中。

前5位是小时,接下来6位是分钟,接下来是6秒&其余的是保留的

我想出了一个讨厌的bitAND掩码,然后在转换回32位整数器之前进行字符串连接。

这似乎过于复杂& CPU很贵。是否有更高效的&更重要的是,优雅的方法?

2 个答案:

答案 0 :(得分:0)

怎么样:

wl = 32
hl = 5
ml = 6
sl = 6

word = hours << (wl - hl) | minutes << (wl-hl-ml) | seconds << (wl-hl-ml-sl)

答案 1 :(得分:0)

在其他搜索(http://varx.org/wordpress/2016/02/03/bit-fields-in-python/)和我确定的评论之间:

class TimeBits(ctypes.LittleEndianStructure):
    _fields_ = [
            ("padding", ctypes.c_uint32,15), # 6bits out of 32
            ("seconds", ctypes.c_uint32,6), # 6bits out of 32
            ("minutes", ctypes.c_uint32,6), # 6bits out of 32
            ("hours", ctypes.c_uint32,5), # 5bits out of 32
            ]

class PacketTime(ctypes.Union):
    _fields_ = [("bits", TimeBits),
            ("binary_data",ctypes.c_uint32)
            ]


packtime = PacketTime()
now = datetime.today().timetuple()
packtime.bits.hours = now[3]
packtime.bits.minutes = now[4]
packtime.bits.seconds = now[5]

它提供了相关字段的更清晰的结构化设置,尤其是至少每秒调用一次。已经为Date和其他bitpacking向量创建了类似的结构