【问题标题】:Base convert in python given a string给定字符串的python中的基本转换
【发布时间】:2026-02-15 19:10:01
【问题描述】:

在 PHP 中,给定一个字符串值(用字符分隔的整数),我们可以计算出它的整数表示:

$hashable = "123A123"; // notice "A" delim
$hash_int = base_convert($hashable, 11, 10);
echo $hash_int;

输出

2151042

它很有用,因为结果对于大量字符串(当然是短字符串)是唯一的。我在我的应用程序中使用它来生成 ID。

我们如何在 python 中进行相同的转换?是否可以在 PHP 和 python 中为相同的字符串生成相等的整数?

也许首先我们需要获取hashable stringhash int,然后转换整数的基数,但我们究竟是如何做到这一点的呢?

【问题讨论】:

  • 整数表示是什么?
  • 更新了原始问题。我不确定,但如果hashable 没有整数,代码将返回 0。我不确定 php 在哪里以及如何进行转换。
  • 我什至不明白转换是如何工作的,z 不在base11...?将 base11 仅包含 a 来表示 11
  • 除此之外,您可以使用int(str,base=num) 从任何基数转换为base10,然后您可以执行this 之类的操作将该十进制转换为另一个基数
  • 所有非数字?根据基数(大于基数 10),应该有一些字母被接受

标签: php python python-3.x base


【解决方案1】:

以前建议的方法对于二进制和许多其他转换将失败,这将从 2 到 36 的任何基数,并根据php implementation 为无效字符串返回 0,php 实现不会忽略输出中的字母,除非您为基数提供无效输入,然后它会尝试仅查找数字并进行转换,因此您也无法尽可能返回 int 并且将在输出中获得字母:

def to_base(n, bse):
    digs = "0123456789abcdefghijklmnopqrstuvwxyz"
    tmp = []
    while n:
        n, i = divmod(n, bse)
        tmp.append(digs[i])
    return "".join(tmp[::-1])



def chng_frm_base(s, frm_bse, to_bse):
    if to_bse < 2 or to_bse > 36 or frm_bse < 2 or frm_bse > 36:
        raise ValueError("bases must be between 2-36")
    try:
        return to_base(int(s, frm_bse), to_bse)
    except ValueError:
        try:
            n = int("".join([ch for ch in s if ch.isdigit()]),frm_bse)
            return to_base(n, to_bse)
        except ValueError:
            return 0

输出:

In [13]: chng_frm_base("123A123", 11, 10)
Out[13]: '2151042'

In [14]: chng_frm_base("123A123", 11, 8)
Out[14]: '10151202'

In [15]: chng_frm_base("123A123", 11, 2)
Out[15]: '1000001101001010000010'

In [16]: chng_frm_base("123A123", 11, 35)
Out[16]: '1f5xc'

In [17]: chng_frm_base("123A123", 11, 1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-9776e0abca26> in <module>()
----> 1 chng_frm_base("123A123", 11, 1)

<ipython-input-2-9c00d800545d> in chng_frm_base(s, frm_bse, to_bse)
     10 def chng_frm_base(s, frm_bse, to_bse):
     11     if to_bse < 2 or to_bse > 36 or frm_bse < 2 or frm_bse > 36:
---> 12         raise ValueError("bases must be between 2-36")
     13     try:
     14         return (to_base(int(s, frm_bse), to_bse))

ValueError: bases must be between 2-36

In [18]: chng_frm_base("hello world!", 10, 2)
Out[18]: 0

如果您使用 php 运行相同的示例,则会为所有输出相同的值。

【讨论】:

  • 这是一个相当全面的答案,但仍然与我的本地 PHP 安装不同:$hashable = "123z123"; $hash_int = base_convert($hashable, 11, 10); echo $hash_int; 194472
  • @davejagoda。立即尝试
  • chng_frm_base 是一个糟糕的函数名称