当前位置: 首页 > 面试题库 >

是否有更快的方法将任意大整数转换为大字节序字节序列?

段干庆
2023-03-14
问题内容

我有以下Python代码可以做到这一点:

from struct import pack as _pack

def packl(lnum, pad = 1):
    if lnum < 0:
        raise RangeError("Cannot use packl to convert a negative integer "
                         "to a string.")
    count = 0
    l = []
    while lnum > 0:
        l.append(lnum & 0xffffffffffffffffL)
        count += 1
        lnum >>= 64
    if count <= 0:
        return '\0' * pad
    elif pad >= 8:
        lens = 8 * count % pad
        pad = ((lens != 0) and (pad - lens)) or 0
        l.append('>' + 'x' * pad + 'Q' * count)
        l.reverse()
        return _pack(*l)
    else:
        l.append('>' + 'Q' * count)
        l.reverse()
        s = _pack(*l).lstrip('\0')
        lens = len(s)
        if (lens % pad) != 0:
            return '\0' * (pad - lens % pad) + s
        else:
            return s

这大约需要174个usec才能转换2**9700 - 1为我的html" target="_blank">计算机上的字节字符串。如果我愿意使用特定于Python 2.7和Python
3.x的bit_length方法,可以通过l在开始时就将数组预先分配为恰好正确的大小并使用l[something] =语法而不是来将其缩短到159个usecs l.append

我有什么可以做的更快?这将用于转换密码术中使用的大质数以及一些(但不是很多)较小的数。

编辑

目前,这是Python <3.2中最快的选项,任一方向花费的时间大约是接受答案的一半:

def packl(lnum, padmultiple=1):
    """Packs the lnum (which must be convertable to a long) into a
       byte string 0 padded to a multiple of padmultiple bytes in size. 0
       means no padding whatsoever, so that packing 0 result in an empty
       string.  The resulting byte string is the big-endian two's
       complement representation of the passed in long."""

    if lnum == 0:
        return b'\0' * padmultiple
    elif lnum < 0:
        raise ValueError("Can only convert non-negative numbers.")
    s = hex(lnum)[2:]
    s = s.rstrip('L')
    if len(s) & 1:
        s = '0' + s
    s = binascii.unhexlify(s)
    if (padmultiple != 1) and (padmultiple != 0):
        filled_so_far = len(s) % padmultiple
        if filled_so_far != 0:
            s = b'\0' * (padmultiple - filled_so_far) + s
    return s

def unpackl(bytestr):
    """Treats a byte string as a sequence of base 256 digits
    representing an unsigned integer in big-endian format and converts
    that representation into a Python integer."""

    return int(binascii.hexlify(bytestr), 16) if len(bytestr) > 0 else 0

在Python 3.2中,int该类具有to_bytesfrom_bytes函数,它们可以 上述方法更快地完成此任务。


问题答案:

为了完整性和将来读者对该问题的了解:

从Python
3.2开始,提供了一些函数int.from_bytes()int.to_bytes()这些函数可以按字节顺序选择在bytesint对象之间进行转换。



 类似资料:
  • 问题内容: 如何将(大字节序)可变大小的二进制字节数组转换为(无符号)整数/长整数?例如,代表4404 现在,我正在使用 它虽然很小,但有点可读,但可能效率不高。有没有更好(更明显)的方法? 问题答案: 传统上,Python对于“大尾数C布局中的数字”用处不大,而对于C来说则用不了太多。(如果要处理2字节,4字节或8字节的数字,那么答案就是) 但是足够多的人厌倦了没有一种明显的方法可以做到这一点,

  • 问题内容: 我有一个接收a的函数,但是我所拥有的a是进行此转换的最佳方法是什么? 我想我可以走很长一段路,然后将其放入字符串并放入字节中,但这听起来很难看,而且我认为还有更好的方法可以做到。 问题答案: 我同意Brainstorm的方法:假设您要传递机器友好的二进制表示形式,请使用该库。OP建议可能会有一些开销。纵观源的实施,我看到它做了一些运行时的决策最大的灵活性。 对?Write()接受一个非

  • 问题内容: 我正在尝试编写一个将接受所有数据类型的哈希。一旦进入函数,我将数据作为字节数组处理。我在弄清楚如何将任意类型转换为字节数组时遇到麻烦。 我尝试使用二进制包,但它似乎取决于传入的数据类型。fn (docs)的参数之一需要知道参数的字节顺序。 所有数据类型的大小都是字节的某个倍数(甚至是布尔值),因此理论上这应该很简单。 下面有问题的代码, 问题答案: 代码中的其他问题使我较早离开了软件包

  • 问题内容: 将转换为的快速方法是什么? 例如 问题答案: 看看ByteBuffer类。 设置字节顺序保证了,,和。 或者,你可以手动执行以下操作: 该班是专为尽管这样的脏手任务。实际上,私有定义了以下辅助方法:

  • 本文向大家介绍C#将字节数组转换成数字的方法,包括了C#将字节数组转换成数字的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#将字节数组转换成数字的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍C#将数字转换成字节数组的方法,包括了C#将数字转换成字节数组的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#将数字转换成字节数组的方法。分享给大家供大家参考。具体实现方法如下: 下面的代码用到了MemoryStream 和 BinaryWriter 希望本文所述对大家的C#程序设计有所帮助。