0

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

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

我也通过一个easygui对话框返回了值......但是当我输入一个字符时,我得到一个15个字符的响应......
所以a)我在某处得到了一个额外的字符(b4主力?)和
b)为什么不是返回值 16 个字符?
我还尝试了 4 个字母的单词和其他各种大小,但我总是以 7 个字符太长。所以我在某处获得了一个额外的条目值,并且总是返回一个字符,而不是完整的 8 个返回值......
我不知道发生这种情况的底层过程,但它应该是我应该知道的......谢谢.. .

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

EasyGui

#Imports
import OTPModule as TP
import easygui as EG

Plain = EG.textbox(msg='Enter Message', title='OTP', text='Hi', codebox=1)
XORD, Key = TP.Gather(Plain)
EG.textbox(msg='XORD', title='OTP - XOR Message', text=XORD, codebox=1)
EG.textbox(msg='Key', title='OTP - Key', text=Key, codebox=1)


raw_input("Press Enter To Decrypt")

XOrd = EG.textbox(msg='Enter XOR Message', title='OTP', text='01', codebox=1)
Key = EG.textbox(msg='Enter Key', title='OTP', text='10', codebox=1)
Plain = TP.Release(XORD, Key)
EG.textbox(msg='ASCII', title='OTP', text=Plain, codebox=1)

raw_input("Press Enter To Exit")

模块..

#################
#  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)
4

1 回答 1

2

编辑

安装easygui并尝试textbox()后,返回的 unicode 字符串带有一个尾随的换行符......

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

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

>>> Plain = Plain.rstrip()
>>> Plain
u'Hi'

另请注意,将返回一个 unicode 字符串。如果您输入非 ascii 数据,您可能会遇到解码问题,例如u'\u4000'(= 䀀) -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 位字符串 - 同样不会发出任何前导零位。

于 2014-12-10T07:03:47.393 回答