【问题标题】:Calculating 16-bit integer value from two 8-bit integers?从两个 8 位整数计算 16 位整数值?
【发布时间】:2016-03-11 13:11:48
【问题描述】:

为了说明我的意思:在十六进制编辑器中,我有8C 01,即396 little-endian。我正在使用的数据是一个包含两个单独的 8 位整数 i = (140, 1) 的元组。

要计算 16 位值,我的第一种方法是简单地将第二个整数乘以 255,然后将第一个整数相加。然而,这种方法是完全错误的,因为它没有给出正确的值(由于我缺乏知识)。谁能提供更好的(可能是 Pythonic)方法?

【问题讨论】:

    标签: python integer hex


    【解决方案1】:

    您需要将它乘以 256 (28)。所以函数应该是这样的:

    def pack (tup) :
        return 256*tup[1]+tup[0]
    

    或执行bitwise shift,这在使用位时更有意义:

    def pack(tup) :
        return (tup[1]<<8)|tup[0]
    

    这里&lt;&lt; 表示您将tup[1] 的值放在左边八个位置。管道 (|) 表示您执行 OR 操作。如果您强制元组中的值小于 256 并且可以 - 至少在理论上 - 导致一些加速,这是合理的。

    更通用

    如果您的元组具有任意长度(例如三个、四个或更多元素),您可以定义一个更通用的函数:

    def pack(tup) :
        sum = 0
        for i in range(len(tup)) :
            sum |= tup[i]<<(i<<3)
        return sum
    

    这里&lt;&lt;3 用作与8 相乘的快捷方式,因此等效函数为:

    def pack(tup) :
        sum = 0
        for i in range(len(tup)) :
            sum |= tup[i]<<(8*i)
        return sum
    

    或者写出来,是这样的:

    tup[0]|(tup[1]<<8)|(tup[2]<<16)|(...)
    

    【讨论】:

    • 我喜欢后一种方法,但只是为了巩固我的理解,您介意使用 8 位的 4 元组为 32 位数字编写一个示例吗?
    • 嗯,它归结为乘以 256 的幂。因此,对于三个项目,您可以将其计算为 65536*tup[2]+256*tup[1]+tup[0](tup[2]&lt;&lt;16)|(tup[1]&lt;&lt;8)|tup[0]。该函数使用&lt;&lt;3 代替与8 相乘。
    • @WillemVanOnsem,我假设您在最后一个代码 sn-p 中的意思类似于 tup[0]|(tup[1]&lt;&lt;3)|(tup[2]&lt;&lt;6)|(tup[3]&lt;&lt;9)|(...)?出于某种原因,我对此进行的编辑违反了本网站的编辑规则并被拒绝。
    • @OutstandingBill:嗨,不,它是tup[0]|(tup[1]&lt;&lt;8)|...,所以有八跳。 &lt;&lt;3 应用于第一个代码示例中的 i,将其乘以 8(乘以 8 与向左移动三位相同)。
    【解决方案2】:

    你应该乘以 256...

    >>> i[1]*256 + i[0]
    396
    

    有一种使用struct模块的Python方式,但在这种简单的情况下不是必需的。

    >>> from struct import pack, unpack
    >>> unpack('<H', pack('BB', *i))[0]
    396
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多