【问题标题】:String -> ASCII+1 -> Bit string字符串 -> ASCII+1 -> 位串
【发布时间】:2020-02-28 00:58:02
【问题描述】:

项目: 每个字符的数字 ASCII 值加 1。 将其转换为位字符串。 将此字符串的位向左移动一位。 加密字符串中的单空格字符分隔生成的位字符串。

程序输入输出示例如下:

输入消息:Hello world!

0010011 1001101 1011011 1011011 1100001 000011 1110001 1100001 1100111 1011011 1001011 000101

# Put your code here
string = input("Enter message: ")

#Convert string from ASCII to Decimal
A_string = [ord(c) for c in string]
print(A_string)

# add 1 to ASCII value 
B_string = A_string
for i in range(len(B_string)):
    B_string[i] = B_string[i] + 1 
print(B_string)


#Decimal to Binary
decimal = B_string
remainder = decimal
Binary_string = decimal

for i in range(len(decimal)):
    remainder[i] = int(decimal[i])
    remainder[i] %= 2
    decimal[i] = decimal[i] // 2
    Binary_string[i] = str(remainder[i] + Binary_string[i])
print(Binary_string)


#Shift Left
length = len(Binary_string)-1
start = 1
shiftLeft = ''
while length !=0:
    shiftLeft = shiftLeft + Binary_string[start] + " "
    length -= 1
    start += 1
shiftLeft += Binary_string[0]
print(shiftLeft)


我的结果: 输入消息:Hello world!

[72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33, 92]
[73, 102, 109, 109, 112, 33, 120, 112, 115, 109, 101, 34, 93]
['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
0 0 0 0 0 0 0 0 0 0 0 0 0

****最大的目标是做这个老派,即不使用内置函数,而是使用循环

【问题讨论】:

    标签: python string type-conversion bit-manipulation ascii


    【解决方案1】:

    在以下代码示例中,输入字符串被转换为 ASCII 值列表,这些值通过加一来移位。然后将该值转换回字符串并放入名为shiftedChars 的列表中。最后,这些字符串被转换成二进制。

    inputString = input("Enter the input string: ")
    asciiValues = []
    shiftedChars = []
    results = []
    
    # loop through each character in the input string
    for character in inputString:
        value = ord(character) + 1                           #convert to ascii and shift by 1
        asciiValues.append(value)                            #add to list of ascii values
    
    # loop through each value in the list
    for asciiValue in asciiValues:
        shiftedChars.append(chr(asciiValue))                 #convert back to string and store in another list
    
    # loop through each character in the shiftedChar list
    for shiftedChar in shiftedChars:
        res = "".join(f"{ord(shiftedChar):08b}")             #convert to binary
        results.append(res)                                  #store result
    
    #print results
    for result in results:
        print(result, end=" ")  
    

    运行时:

    Enter the input string: Hello world
    

    输出:

    01001001 01100110 01101101 01101101 01110000 00100001 01111000 01110000 01110011 01101101 01100101
    

    在二进制序列中,Ifmmp!xpsme 的移位字符是什么。

    编辑:----

    从字符串转换为二进制的一些额外解释。 虽然它的语法看起来非常混乱,但希望这将有助于理清思路。

    String -> Ascii    - use ord()
    Ascii - > Char     - use chr()
    Char -> Binary     - convert char using ord() to ascii then format into binary
    

    因此,对于最后一种将 char 转换为二进制的方法,我们需要首先获得 ascii 数值,然后我们将使用 .format 进行转换。

    现在查看res = "".join(f"{ord(shiftedChar):08b}"),我们或许可以将其分解为更小的部分,并发现某些代码可能不需要。

    让我们看一个更小的样本:

    print(ord("a"))                         #ord("a")= 97 | using for the shiftedChar
    print(format(97, '08b'))                #01100001
    emptyString = ""
    print(emptyString.join(f"{97:08b}"))    #01100001
    

    如您所见,format 方法接受除了 ascii 值之外的第二个参数。这用于告诉如何格式化最终结果。有不同形式的二进制,例如没有前导 0 的二进制或以 0b 开头的序列。在空字符串上使用 .join 似乎主要是为了将其保留为字符串。希望这能解释发生了什么。

    【讨论】:

    • 这看起来棒极了,我还没到那里,正如您通过我的编码看到的那样。我也在寻求帮助...在我的编码中,而不是重新编写的完整程序。我必须能够通过循环将 int 转换为二进制长格式。不幸的是:我认为 res = "".join(f"{ord(shiftedChar):08b}") 离这条路有点远=)
    • @KrisA 我一直在寻找一种将字符串转换为二进制的更基本的方法,但这对我来说似乎是最简单的。我发现了其他一些方法,但它们比这个更复杂。基本上,这将.join 用于字符串对象并将其加入二进制数据的格式。我希望这能解决你的问题。
    • 老派肯定更复杂,如果你能解释那行代码在做什么我可以用它,但我必须能够解释(理解它)才能使用它跨度>
    • @KrisA 我在最后转换为二进制时添加了更多描述。本质上,它使用了一种格式方法,将字符值和输出格式作为参数,即shiftedChar 值和08b
    • 谢谢@Jamin,但您所做的编码没有给出正确的答案:输入消息:Hello world! 0010011 1001101 1011011 1011011 1100001 000011 1110001 1100001 1100111 1011011 1001011 000101 我看到您在 ASCII 值中添加 1 的位置...我得到了转换为字符串...仍然在 res = ...' 部分(我相信将它们转换为二进制并将它们添加回字符串并摆脱 0b 格式的字符。我很确定我可以在左移中编码,但即使将字符向左移动一次也不会给我我的结果张贴在帖子 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多