Python将非数字字符串存储为数字

Python将非数字字符串存储为数字,python,Python,我目前正试图找到一种方法,将任何类型的文本转换为数字,以便以后可以将其转换回文本。 比如说: text = "some string" number = somefunction(text) text = someotherfunction(number) print(text) #output "some string" 可以使用ASCII值执行此操作: ASCII到int: ord('a') # = 97 返回到字符串: str(unichr(97)) # = 'a' 从那里,您

我目前正试图找到一种方法,将任何类型的文本转换为数字,以便以后可以将其转换回文本。 比如说:

text = "some string"
number = somefunction(text)

text = someotherfunction(number)
print(text) #output "some string"

可以使用ASCII值执行此操作:

ASCII到int:

ord('a')  # = 97
返回到字符串:

str(unichr(97))  # = 'a'
从那里,您可以一次迭代一个字符,然后将它们存储在另一个字符串中。假设您使用的是标准ASCII字符,则需要将数字归零(因为有些是两位数,有些是三位数),如下所示:

要对此进行解码,您将一次读取三个字符的新字符串,并将其解码为一个新字符串

这需要考虑以下几点:

  • 所有字符都可以用ASCII表示(如果不是,可以使用Unicode代码点)
  • 您将数值存储为字符串,而不是实际的int类型(在Python中,这没什么大不了的,可以避免您在不同的系统上处理int的最大值)
  • 您绝对必须有一个数值,即某种十六进制表示(可以转换为int),加密算法将无法工作
  • 我们讨论的不是需要以这种方式转换的GB+文本

您可以使用ASCII值执行此操作:

ASCII到int:

ord('a')  # = 97
返回到字符串:

str(unichr(97))  # = 'a'
从那里,您可以一次迭代一个字符,然后将它们存储在另一个字符串中。假设您使用的是标准ASCII字符,则需要将数字归零(因为有些是两位数,有些是三位数),如下所示:

要对此进行解码,您将一次读取三个字符的新字符串,并将其解码为一个新字符串

这需要考虑以下几点:

  • 所有字符都可以用ASCII表示(如果不是,可以使用Unicode代码点)
  • 您将数值存储为字符串,而不是实际的int类型(在Python中,这没什么大不了的,可以避免您在不同的系统上处理int的最大值)
  • 您绝对必须有一个数值,即某种十六进制表示(可以转换为int),加密算法将无法工作
  • 我们讨论的不是需要以这种方式转换的GB+文本

如果您使用的是Python 3,则非常简单。首先,将所选编码中的
str
转换为
bytes
utf-8
通常是合适的),然后使用
int.from\u bytes
转换为
int

number = int.from_bytes(mystring.encode('utf-8'), 'little')
向后转换稍微有点困难(除非您已将结果字符串的长度存储在其他地方,否则将丢失尾随
NUL
字节;如果切换到
'big'
尾随,则将丢失前导
NUL
字节而不是尾随):

您可以在Python 2中执行类似的操作,但效率/直接性较低:

import binascii
number = int(binascii.hexlify(mystring.encode('utf-8')), 16)

hx = '%x' % number
hx = hx.zfill(len(hx) + (len(hx) & 1))  # Make even length hex nibbles
recoveredstring = binascii.unhexlify(hx).decode('utf-8')

这相当于Python3中的
'big'
endian方法;在每个方向上反转中间字节将获得
'little'
效果。

如果您使用的是Python3,这非常简单。首先,将所选编码中的
str
转换为
bytes
utf-8
通常是合适的),然后使用
int.from\u bytes
转换为
int

number = int.from_bytes(mystring.encode('utf-8'), 'little')
向后转换稍微有点困难(除非您已将结果字符串的长度存储在其他地方,否则将丢失尾随
NUL
字节;如果切换到
'big'
尾随,则将丢失前导
NUL
字节而不是尾随):

您可以在Python 2中执行类似的操作,但效率/直接性较低:

import binascii
number = int(binascii.hexlify(mystring.encode('utf-8')), 16)

hx = '%x' % number
hx = hx.zfill(len(hx) + (len(hx) & 1))  # Make even length hex nibbles
recoveredstring = binascii.unhexlify(hx).decode('utf-8')


这相当于Python3中的
'big'
endian方法;在每个方向上反转中间字节会得到
的“小”效果。

你的问题是。。。?你自己的试验包括…?你用这个数字做什么?这有什么意义?如果字符串可能很长,则需要有真正大的数字,因为数字需要的位数与字符串中原始位数的位数一样多。@MASL我的问题是,如果有这种情况,我尝试了ascii值,但这些值只适用于单个字母。此外,我在谷歌上找不到任何东西,因为每个结果都给了我如何将数字字符串转换为整数的问题。@Barmar我想创建一个小加密程序,为此我需要字符串作为数字来执行计算,但是我还需要能够将数字转换回原始字符串。对单个字符进行操作,而不是整个字符串。你的问题是。。。?你自己的试验包括…?你用这个数字做什么?这有什么意义?如果字符串可能很长,则需要有真正大的数字,因为数字需要的位数与字符串中原始位数的位数一样多。@MASL我的问题是,如果有这种情况,我尝试了ascii值,但这些值只适用于单个字母。此外,我在谷歌上找不到任何东西,因为每个结果都给了我如何将数字字符串转换为整数的问题。@Barmar我想创建一个小加密程序,为此我需要字符串作为数字来执行计算,但我还需要能够将数字转换回原始字符串。对单个字符进行操作,而不是对整个字符串进行操作。这对单个字符有效,如何将其扩展到长字符串?我希望OP至少了解如何迭代字符串,但添加了一个好的度量示例他想要一个单一的数字,不是名单。毕竟,字符串在内部只是一个字符代码数组。因为我需要对数字进行计算,所以我更喜欢一个可以返回单个数字的方法,否则我将不得不存储额外的数据以将数字转换回原始列表。谢谢,我不知道有zfill这样的东西。我要走了