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

如何在Python中将整数转换为最短的url安全字符串?

长孙硕
2023-03-14
问题内容

我想以最短的方式表示URL中的整数。例如,可以使用十六进制将11234缩短为“
2be2”。由于base64使用的是64个字符的编码,因此应该有可能使用比十六进制更少的字符来表示base64中的整数。问题是我不知道使用Python将整数转换为base64(然后再转换回)的最干净方法。

base64模块具有处理字节串的方法-因此,也许一种解决方案是将整数转换为Python字符串的二进制表示形式…但是我也不知道该怎么做。


问题答案:

这个答案在本质上与道格拉斯·里德(Douglas Leeder)的相似,但有以下变化:

  • 它不使用实际的Base64,因此没有填充字符
  • 它没有将数字先转换为字节字符串(以256为基数),而是将其直接转换为以64为基数,这具有使您可以使用符号字符来表示负数的优点。
        import string
    ALPHABET = string.ascii_uppercase + string.ascii_lowercase + \
               string.digits + '-_'
    ALPHABET_REVERSE = dict((c, i) for (i, c) in enumerate(ALPHABET))
    BASE = len(ALPHABET)
    SIGN_CHARACTER = '$'

    def num_encode(n):
        if n < 0:
            return SIGN_CHARACTER + num_encode(-n)
        s = []
        while True:
            n, r = divmod(n, BASE)
            s.append(ALPHABET[r])
            if n == 0: break
        return ''.join(reversed(s))

    def num_decode(s):
        if s[0] == SIGN_CHARACTER:
            return -num_decode(s[1:])
        n = 0
        for c in s:
            n = n * BASE + ALPHABET_REVERSE[c]
        return n
    >>> num_encode(0)
    'A'
    >>> num_encode(64)
    'BA'
    >>> num_encode(-(64**5-1))
    '$_____'

一些注意事项:

  • 您可以(以 微不足道的方式 )通过将string.digits放在字母表的首位(并使符号字符为“-”)来提高64位基数的可读性。我根据Python的urlsafe_b64encode选择了执行的顺序。
  • 如果要编码很多负数,则可以使用符号位或一个/两个补码代替符号字符来提高效率。
  • 通过更改字母,您应该能够轻松地使此代码适应不同的基础,将其限制为仅字母数字字符或添加其他“ URL安全”字符。
  • 我建议 不要 在大多数情况下在URI中使用除base 10以外的表示形式-与HTTP的开销相比,它增加了复杂性并使调试更加困难而又没有大量的节省-除非您要使用TinyURL式的外观。


 类似资料:
  • 问题内容: 假设我有以下字符串: 是否有一些功能或模块可以将上述字符串转换为以下所有字符都更改为与url兼容的字符串: 在python中执行此操作的最佳方法是什么? 问题答案: Python 2的urllib.quote_plus和Python 3的urllib.parse.quote_plus 输出:

  • 问题内容: 我有一个来自MySQL查询的元组,像这样: 我想将所有字符串元素转换为整数,然后将它们放回列表列表中: 我试图用它来实现它,eval但是还没有得到任何体面的结果。 问题答案: 是Python标准的内置函数,用于将字符串转换为整数值。你可以使用包含数字作为参数的字符串来调用它,然后返回转换为整数的数字: 上面的照片2。 如果你知道列表T1的结构(它仅包含列表,仅一个级别),则可以在Pyt

  • 问题内容: Python的math模块包含诸如&的便捷函数。这些函数采用浮点数,并返回在其之下或之上的最接近的整数。但是,这些函数将答案作为浮点数返回。例如: 现在返回: 从该浮点数中获取整数而不冒取舍入错误风险的最安全方法是什么(例如,如果浮点数等于1.99999),或者我应该完全使用另一个函数? 问题答案: 可以用浮点数表示的所有整数均具有精确的表示形式。这样您就可以安全地使用结果了。仅当您尝

  • 问题内容: 有没有人能将不安全的字符串转换为? 该字符串通常回来为:或类似的东西。 在这种情况下,我要。如果我想。我从不希望该方法失败,但是我不愿意尝试,除非通过它只是为了隐藏错误(以防万一发生极端情况)。 问题答案: 在这种情况下,您确实有一种避免/的方法,尽管我不建议这样做(假设您的输入字符串名为,并且您处于必须返回某些内容的函数中): 将在部分就是你回什么是你想要比如说,如果是,空,全空间,

  • 问题内容: 我的Jenkinsfile中有以下内容: 我想在多个地方重用诸如timeout_mins之类的环境参数,但是对于某些插件,需要在某些地方将其转换为整数。我在上面的示例中遇到的错误如下: org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty java.lang.IllegalArgumentEx

  • 问题内容: 我有和。我想转换和整数和执行。如何在UNIX中做到这一点? 当前为我返回的结果。 问题答案: 标准解决方案: 您也可以: 但是请注意,这将被视为八进制数字!(因此与相同,但与有所不同)。