将文本转换为二进制。2部分发行

2024-06-09 03:49:04 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧。。。我正在写一个python脚本把文本转换成二进制。。。
Im使用easygui快速转换短短语并测试问题。我的问题。。。
主要工作是:

BText = bin(int(binascii.hexlify(DText),16))

我有一个简单的对话框返回值。。。但当我输入一个字符时,我会得到15个字符的响应。。。
所以a)我在某处得到了一个额外的字符(b4工作马?)为什么返回16个字符?
我还试过4个字母的单词和其他各种大小的单词,结果总是7个字符太长。所以我在某个地方得到了一个额外的输入值,并且总是返回一个少于8个完整返回值的字符…
我一点也不知道导致这种情况发生的基本过程,但我应该知道。。。谢谢…

好吧,我试了一个小时来发布我的代码,但它的格式不正确,我想。。。运行Python 我使用easygui.textbox接收输入和输出。
输入通过上面的工作程序运行。然后使用BText = str(BText)[2:]从返回的输入中剥离0b。然后返回结果字符串并通过easygui.textbox... 在

随和

^{pr2}$

模块。。在

#################
#  One Time Pad #
#    (Module)   #
#  Python 2.7.8 #
#    Nov 2014   #
#Retler & Amnite#
#################


    #imports
import binascii
import random

def Gather(DText):

  print(DText)#Debug

  #First Things First... Convert To Binary
  BText = bin(int(binascii.hexlify(DText),16))

  #Strip 0b
  BText = str(BText)[2:]

  print(BText)#Debug

  #Generate Key
  KText = []
  a = 0

  while a < len(BText):
    b = random.randint(0,1)
    KText.append(b)
    a = a+1

  KText = ''.join(map(str,KText))
  print(KText)#Debug
  print a

  #So apparently we have to define the XOR ourselves
  #0^0=0, 0^1=1, 1^0=1, 1^1=0
  EText = []
  a = 0

  while a < len(BText):
    if BText[a] == KText[a]:
      EText.append(0)
    else:
      EText.append(1)
    a = a+1

  EText = ''.join(map(str,EText))

  return(EText, KText)

######The Other Half#######

def Release(EText, KText):

  print(EText)#Debug
  print(KText)#Debug

  #XOR
  BText = []
  a = 0

  while a < len(EText):
    if EText[a] == KText[a]:
      BText.append(0)
    else:
      BText.append(1)
    a = a+1

  BText = ''.join(map(str,BText))

  print(BText)#Debug

  #Binary To ASCI(Re-Add 0b)
  DText = int('0b'+BText,2)
  DText = binascii.unhexlify('%x' % DText)

  return(DText)

Tags: debuglen字符intprintappendwhilestr
1条回答
网友
1楼 · 发布于 2024-06-09 03:49:04

编辑

安装了easygui并尝试了textbox(),unicode字符串将返回一个尾随的新行字符。。。在

>>> Plain = EG.textbox(msg='Enter Message', title='OTP', text='Hi', codebox=1)
# hit OK in text box
>>> Plain
u'Hi\n'

这就是附加字符的来源。您可以通过以下方式删除新行:

^{pr2}$

还要注意,返回的是unicode字符串。如果您输入非ascii数据,您可能会遇到解码问题,例如u'\u4000'(=16384;)-hexlify()将爆炸,但这是另一个问题。在

原始答案

我不熟悉easygui,但我猜它会产生UTF-16输出或其他一些多字节编码的数据。尝试使用repr(input_string)或类似的方法打印输入字符。这可能就是为什么您只输入一个字符时会看到一个附加字符:

>>> bin(int(hexlify('a'), 16))[2:]
'1100001'
>>> bin(int(hexlify('a'.encode('utf-16-le')),16))[2:]
'110000100000000'

在第一个例子中,单个字符被转换成7位(前导零不是由bin()发出的)。 在第二个示例中,UTF-16编码的长度为2个字节:

>>> 'a'.encode('utf-16-le')
'a\x00'

因此,结果是15位字符串-同样,任何前导零位都不会发出。在

相关问题 更多 >