首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用每个字母的2个字母表字符将字符串转换为自定义基

如何使用每个字母的2个字母表字符将字符串转换为自定义基
EN

Stack Overflow用户
提问于 2020-12-04 12:18:21
回答 2查看 116关注 0票数 0

下面的函数将数字255 (base10)转换为'FF' (base16),使用base16字母表'0123456789ABCDEF'

我很难理解如何修改这些函数,以便它们使用每个字母中的2个字符,这样数字255 (base10)就可以使用修改后的base16字母表'x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF'转换成'xFxF' (base16)

代码语言:javascript
复制
def v2r(num, alphabet):
  """Convert base 10 number into a string of a custom base (alphabet)."""
  alphabet_length = len(alphabet)
  result = ''
  while num > 0:
    result = alphabet[num % alphabet_length] + result
    num  = num // alphabet_length
  return result


def r2v(data, alphabet):
  """Convert string of a custom base (alphabet) back into base 10 number."""
  alphabet_length = len(alphabet)
  num = 0
  for char in data:
    num = alphabet_length * num + alphabet[:alphabet_length].index(char)
  return num

base16 = v2r(255, '0123456789ABCDEF')
base10 = r2v(base16, '0123456789ABCDEF')
print(base16, base10)
# output: FF 255

# base16 = v2r(255, 'x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF')
# base10 = r2v(base16, 'x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF')
# print(base16, base10)
# output: xFxF 255
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-04 13:01:07

这里有一个可能的解决办法。我认为您的bug来自于python类型和可迭代性定义的混淆。

我修改了基本的16字母表,它现在是一个项目列表。然后,我也修改了一些函数,以考虑到这一点,而且它看起来很有效。

代码语言:javascript
复制
def v2r(num, alphabet):
    """Convert base 10 number into a string of a custom base (alphabet)."""
    alphabet_length = len(alphabet)
    result = []
    while num > 0:
        result = [alphabet[num % alphabet_length]] + result
        num  = num // alphabet_length
    return result


def r2v(data, alphabet):
    """Convert string of a custom base (alphabet) back into base 10 number."""
    alphabet_length = len(alphabet)
    num = 0
    for char in data:
        num = alphabet_length * num + alphabet.index(char)
    return num

alphabet = [
    'x0','x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8',
    'x9', 'xA', 'xB', 'xC', 'xD', 'xE', 'xF'
]
base16 = v2r(255, alphabet)
base10 = r2v(base16, alphabet)
print(''.join(base16), base10)
#  xFxF 255

下面是OP的注释:只需声明以下字母表:

代码语言:javascript
复制
hexa = '0123456789abcdef'
alphabet = [
    a+b for a in hexa for b in hexa
]
票数 1
EN

Stack Overflow用户

发布于 2020-12-04 13:06:08

我建议在开始计算之前删除“x”,因此添加作为函数的第一行

代码语言:javascript
复制
alphabet=alphabet.replace('x','')

因此,您的函数将与两个系统“FFF”或“xFxFxF”一起工作。

代码语言:javascript
复制
def v2r(num, alphabet):
  """Convert base 10 number into a string of a custom base (alphabet)."""
  alphabet=alphabet.replace('x','') ### added
  alphabet_length = len(alphabet)
  result = ''
  while num > 0:
    result = alphabet[num % alphabet_length] + result
    num  = num // alphabet_length
  return result


def r2v(data, alphabet):
  """Convert string of a custom base (alphabet) back into base 10 number."""
  alphabet=alphabet.replace('x','') ### added
  alphabet_length = len(alphabet)
  num = 0
  for char in data:
    num = alphabet_length * num + alphabet[:alphabet_length].index(char)
  return num
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65143417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档