Python 3.x Python3替换ord()和chr() 对于word中的i: c=作战需求文件(i)-int(关键) 如果c

Python 3.x Python3替换ord()和chr() 对于word中的i: c=作战需求文件(i)-int(关键) 如果c,python-3.x,chr,ord,Python 3.x,Chr,Ord,在没有ord()和chr()的情况下,是否有其他方法来替换此选项 多谢各位 这是一个使用模块加编码/解码的代码。这段代码对于大数据来说速度非常快,并且不需要Python循环 numpy模块可以使用python-m pip install numpy轻松安装。如果您需要不使用numpy、使用普通Python的解决方案,并且运行速度不是问题,请告诉我,我会重写,但在普通Python中,代码在大数据上的运行速度会慢得多 你也可以 下面的另一个解决方案不使用任何模块 word='Duck' 键=1 文本

在没有ord()和chr()的情况下,是否有其他方法来替换此选项

多谢各位

这是一个使用模块加编码/解码的代码。这段代码对于大数据来说速度非常快,并且不需要Python循环

numpy
模块可以使用
python-m pip install numpy
轻松安装。如果您需要不使用numpy、使用普通Python的解决方案,并且运行速度不是问题,请告诉我,我会重写,但在普通Python中,代码在大数据上的运行速度会慢得多

你也可以

下面的另一个解决方案不使用任何模块

word='Duck'
键=1
文本=“”
对于我来说,用词来说:
c=int(i.encode('utf-32-be').hex(),16)-int(key)
如果c<97:
c=c+26
b=字节。从十六进制(十六进制(c)[2:].zfill(8))。解码('utf-32-be')
文本+=b
打印(文本)
如果文本符号仅来自集合,则代码可以进一步简化():

word='Duck'
键=1
文本=“”
对于我来说,用词来说:
c=i.encode('ascii')[0]-int(键)
如果c<97:
c=c+26
b=字节((c,)。解码('ascii'))
文本+=b
打印(文本)
使用两个表()

word='Duck'
键=1
tmp=[(c,i)表示枚举中的i,c(字节(范围(128))。解码('ascii'))]
c2i=dict(tmp)
i2c=[e[0]表示tmp中的e]
文本=“”
对于我来说,用词来说:
c=c2i[i]-int(键)
如果c<97:
c=c+26
b=i2c[c]
文本+=b
打印(文本)
通过替换下一行(),可以将前面的代码从ASCII扩展到更宽的字符集(例如16位):


tmp=[(bytes.fromhex(hex(i)[2:].zfill(8)).decode('utf-32-be','replace'),i)对于范围内的i(1 ord()和chr()都内置在python中。替换它们的具体原因是什么?您可以预计算映射(使用dict)从源字符到目标字符,并使用此dict逐个替换word中的字符。如果有特殊原因省略chr/ord,例如某些学校任务,则您也可以使用
bs=word.encode('utf-16')
将字符串转换为字节,然后更改一些字节并使用
word=bs.decode>将其转换回字符串('utf-16')
。并在循环之前将
键设置为int
请详细说明。使用
struct
的原因是什么?@Pynchia使用struct的原因是提问者要求不使用ord/chr,因此
encode/decode+struct unpack/pack
是ord/chr的替代品。也许有更简单的方法将4字节转换为int和back、 我也可以使用
int(bytes.hex(),16)
,而不是
struct
。添加了不带任何模块的解决方案。
        for i in word:
            c = ord(i) - int(key)
            if c < 97:
                c = c + 26
            b = chr(c)
            text += b
# Needs: python -m pip install numpy
import numpy as np

word = 'Duck'
key = 1

a = np.frombuffer(word.encode('utf-32-le'), dtype = np.int32)
a = a - key
a[a < 97] += 26

text = a.tobytes().decode('utf-32-le')

print(text)
import struct

word = 'Duck'
key = 1

text = ''

for i in word:
    c = struct.unpack('<I', i.encode('utf-32-le'))[0] - int(key)
    if c < 97:
        c = c + 26
    b = struct.pack('<I', c).decode('utf-32-le')
    text += b
    
print(text)
word = 'Duck'
key = 1

text = ''

for i in word:
    c = int(i.encode('utf-32-be').hex(), 16) - int(key)
    if c < 97:
        c = c + 26
    b = bytes.fromhex(hex(c)[2:].zfill(8)).decode('utf-32-be')
    text += b
    
print(text)
word = 'Duck'
key = 1

text = ''

for i in word:
    c = i.encode('ascii')[0] - int(key)
    if c < 97:
        c = c + 26
    b = bytes((c,)).decode('ascii')
    text += b
    
print(text)
word = 'Duck'
key = 1

tmp = [(c, i) for i, c in enumerate(bytes(range(128)).decode('ascii'))]
c2i = dict(tmp)
i2c = [e[0] for e in tmp]

text = ''

for i in word:
    c = c2i[i] - int(key)
    if c < 97:
        c = c + 26
    b = i2c[c]
    text += b
    
print(text)
tmp = [(bytes.fromhex(hex(i)[2:].zfill(8)).decode('utf-32-be', 'replace'), i) for i in range(1 << 16)]