Python 将文本转换为二进制。第2部分问题

Python 将文本转换为二进制。第2部分问题,python,encryption,binary,hex,easygui,Python,Encryption,Binary,Hex,Easygui,好的。。。我正在写一个python脚本来将文本转换成二进制我使用easygui快速转换短短语并测试问题。我的问题主要工作是: BText = bin(int(binascii.hexlify(DText),16)) 我还通过easygui对话框返回值。。。但当我输入一个字符时,我会得到15个字符的响应因此a)我在某处得到了一个额外的字符(b4 workhorse?)和b)为什么返回值不是16个字符从返回的输入中剥离0b。然后返回结果字符串并通过easygui.textbox向用户显示 随和的

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

BText = bin(int(binascii.hexlify(DText),16))
我还通过easygui对话框返回值。。。但当我输入一个字符时,我会得到15个字符的响应
因此a)我在某处得到了一个额外的字符(b4 workhorse?)和
b)为什么返回值不是16个字符<我也试过4个字母的单词和其他各种大小的单词,结果总是长了7个字符。因此,我在某个地方得到了一个额外的输入值,并且我总是返回一个字符,少于完整的8个返回…
我一点也不知道导致这种情况发生的基本过程,但我应该知道。。。谢谢…

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

随和的

#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)
#################
#一次性垫#
#(单元)#
#Python 2.7.8#
#2014年11月#
#莱特勒和安妮特酒店#
#################
#进口
导入binascii
随机输入
def聚集(DText):
打印(DText)#调试
#第一件事第一。。。转换成二进制
BText=bin(int(binascii.hexlify(DText),16))
#带0b
BText=str(BText)[2:]
打印(b文本)#调试
#生成密钥
KText=[]
a=0
而a
编辑

安装了
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位字符串-同样,不会发出任何前导零位。

请发布代码,否则其他人只能猜测错误。更改调试打印语句,以便它们打印数据的表示形式,例如
print(repr(DText))
或用倒钩环绕DText`。这样你就可以看到换行符和其他控制字符。我想我应该提一下,有一种更简单的方法可以对文本执行XOR,是linux的7位标准二进制文件吗?有不同的标准吗?老实说,你在编码方面把我弄丢了……我理解2个字节的15位,但不是吗随着输入量的增加,se呈指数增长?无论输入量有多大,我最终得到的字节数几乎都是正确的…假设每个字符等于8,那么它总是额外增加了7 01个字节。这是换行符还是Tk传递的东西?@mhawke:我还怀疑这可能是unicode/UTF问题。看起来EasyGUI具有unicode功能,使用了一些UTF-16的形式根据。否,7位是因为
bin()
不显示任何前导零。额外的字节可能是新行字符。请尝试打印输入脚本的数据-
repr(input_string)
或类似内容。我使用
encode()
模拟utf16输入。@JeremiahSchmidt:bin返回的字符串()
不是固定长度,因为它可以在
long
int
上使用。因此,如果您需要固定长度的位字符串,您需要自己做这件事,例如使用
.zfill()
方法。@PM 2Ring:如果我使用zfill在“二进制”的左侧填充0这仍然会返回相同的字符吗?老实说,在我所做的结束时,4的整除性将是最棒的