有没有一种方法可以创建一个字符列表,将它们写成整数,并将它们写成十六进制代码



我是一名使用Python的初学者,我正在尝试创建加密软件(初学者(。我正在寻找类似的东西:

输入:Apple->A、p、p、L、E->ord((->97,","、"、

然而,我找不到一种方法来将我的字符转换为整数,同时考虑输入中未知数量的字符。

Sentence = list(input("Enter"))
print(Sentence)
ord_sentence = []
for each in range(len(Sentence)):
ord_sentence.append(ord(Sentence[]))

这不起作用,因为句子结尾的论点是空的,但我不知道如何用每个单独的字符填充它。我可以试试

...
...
while len(ord_sentence) <= len(Sentence)
ord_sentence.append(ord(sentence[0]))
ord_sentence.append(ord(sentence[1]))
##Continues on to 1000 to account for unknown input##

但是,当输入的长度不到1000个字符时,我遇到了INDEX ERROR,并放入了类似以下内容:

...
ord_sentence.append(ord(sentence[0]))
if IndexError:
print(ord_sentence)
break

只会导致它打印序列的第一个数字,然后中断。

如有任何帮助,我们将不胜感激!非常感谢。

我认为您需要重新阅读循环是如何工作的。当您对某个内容进行迭代时,该值将被分配给一个变量。在您的代码中,这是each。你从来不会把这个变量用于任何事情,但我认为这正是你想要的。

for each in range(len(Sentence)):
ord_sentence.append(ord(Sentence[each]))

range上进行迭代并按照这里所做的进行索引是可行的,但它不如直接在列表上迭代那么直接。你可以改为:

for each in Sentence:                   # no range, len, each is a character
ord_sentence.append(ord(each))      # take its ord() directly

或者,您可以使用列表理解直接从旧列表构建新列表,而不需要单独的循环和一堆append调用:

ord_sentence = [ord(each) for each in Sentence]

虽然each是您在代码中使用的名称,但更好的做法是为变量指定一个更具体的名称,这将告诉您该值的含义。在这里的第一个版本中,在range上迭代时,我会使用index,因为这就是你得到的数字(列表的索引(。对于其他两个,valuecharacter可能更有意义,因为该值是Sentence列表中的单个字符。说到这个列表,它的名字有点误导,因为我希望一个句子是一个字符串,或者可能是一个单词列表,而不是一个字符列表(可能来自多个或少个句子,例如['f', 'o', 'o']['F', 'o', 'o', '.', ' ', 'B', 'a', 'r', '.'](。

不要为此使用while循环。如果可能的话,您应该避免使用索引——这些是小错误的常见来源,可能会使代码难以阅读。Python使直接在值上循环变得非常容易。你应该有一个真正使用的好理由:

for each in range(len(Sentence)):

而不是:

for a_char in Sentence:
# use a_char here

它会依次给你每个字符

或者理解,它会做同样的事情,同时创建一个列表。这些是python的核心。

[a_char for a_char in s]

再加上join以及hex()ord()函数,这将变得非常简洁。您可以编写类似hex(ord('A'))的函数。有了这个,你就可以理解处理任何长度的字符串:

s = "APPLE"
codedList = [hex(ord(c)) for c in s]
# ['0x41', '0x50', '0x50', '0x4c', '0x45']
# ... or:
codedstring = "".join(hex(ord(c)) for c in s)
# '0x410x500x500x4c0x45'

这符合您对的要求

s='APPLE';
l=list(s);
h=list(map(lambda x: '0x%x' % (ord(x)), l));
print(h);

最新更新