2014-01-19 32 views
0

我知道這可能有點令人困惑,但我是Python的新手。我有一個學校項目的任務是創建一個二進制到二進制的轉換器,該轉換器可以使用高達255和高達8位的二進制文件。需要幫助來追蹤轉換錯誤

我基本上把輸入,分割,檢查,把它放到一個列表中,解決它,把它放到另一個列表並打印完成列表。除了最後一部分 - 轉換之外,它都有效。提前致謝。

我得到兩次轉換此錯誤:

Traceback (most recent call last): 
    File "C:\Users\massi_000\Desktop\COM\Task 1 #2.5.py", line 101, in <module> 
    main() 
    File "C:\Users\massi_000\Desktop\COM\Task 1 #2.5.py", line 91, in main 
    checkUp(noToConvert, mainOp) 
    File "C:\Users\massi_000\Desktop\COM\Task 1 #2.5.py", line 80, in checkUp 
    binaryToDenary(noToConvert) 
    File "C:\Users\massi_000\Desktop\COM\Task 1 #2.5.py", line 30, in binaryToDenary 
    while int(doneListBin[int(r)]) > 1: 
    IndexError: list index out of range 

這是我的全部代碼。

doneListBin = [] 
doneListDen = [] 
splitList = [] 
doneList = [] 


def denaryToBinary(splitList): 
    #Works binary 
    for r in splitList: 
     doneListDen.append(int(splitList[int(r)]) % 2) 
     while int(doneListDen[int(r)]) > 1: 
      doneListDen.append(int(splitList[int(r)]) % 2) 
    print(doneListDen) 

def binaryToDenary(splitList): 
    #Works denary 
    for r in splitList: 
     doneListBin.append(int(splitList[int(r)]) * 2 ** (int(r) + 1)) 
     while int(doneListBin[int(r)]) > 1: 
      doneListBin.append(int(doneListBin[int(r)]) * 2 ** (int(r) + 1)) 
    print(doneListBin) 

無一不精當初這裏

def checkUp(noToConvert, mainOp): 
    try: 
     if int(noToConvert) < 0: 
      raise ValueError 

     elif noToConvert.isdigit() == False: 
      raise ValueError 

     elif mainOp == 'd': 
      if int(noToConvert) > 255: 
       raise ValueError 

      else: 
       #Splits input for checking & passes 
       splitList.extend(noToConvert) 
       print(splitList) 
       denaryToBinary(noToConvert) 


     elif mainOp == 'b': 


      #Makes sure it's not huge 
      if int(len(str(noToConvert))) > 8: 
       raise ValueError 

      #Splits input for checking 
      splitList.extend(noToConvert) 
      print(splitList) 

      #Makes it 8-bit 
      if int(len(noToConvert)) < 8: 
       for i in range(8 - int(len(noToConvert))): 
        splitList.insert(0, 0) 
      #while int(len(str(splitList))) < 8: 
      # splitList.insert(0, 0) 
       # print(splitList) 


      #Should only accept valid inputs (0s and 1s) 
      for i in splitList: 
       if int(splitList[int(i)]) == 0 or int(splitList[int(i)]) == 1: 
        print(str(i) + ' in range') 

       else: 
        raise ValueError 
      binaryToDenary(noToConvert) 
    except ValueError: 
     main() 


def main(): 
    ###  CHOICES  ### 
    mainOp = input("Do you want to convert from (D)enary or from (B)inary?: ").lower() 
    noToConvert = input("What is the number to convert?: ") 

    if mainOp in ("d", "denary", "b", "binary"): 
     checkUp(noToConvert, mainOp) 


    else: 
     raise ValueError 



     # EXECUTION # 
main() 
+0

您至少有兩條語句可能導致該異常,並且沒有發佈回溯,任何人都無法猜測出哪個是錯誤的。這是您應該始終發佈完整追溯的許多原因之一,而不僅僅是對錯誤的描述。 – abarnert

+0

你爲什麼發佈註釋掉的函數?如果它們與樣本不相關,則不要發佈它們。 – Keeler

+0

或者你可以找你的同學工作。 http://stackoverflow.com/questions/19798195/how-would-i-turn-a-number-into-its-binary-representation/19798354#19798354 – Back2Basics

回答

1

您可以嘗試

def binaryToDenary(splitList): 
    doneListBin = [] 
    for r in range(0, len(splitList)): 
     doneDigit = int(splitList[int(r)]) * 2 ** (len(splitList)-int(r)-1) 
     doneListBin.append(doneDigit) 
    print sum(doneListBin) 

還檢查(noToConvert,mainOp),你應該使用binaryToDenary(splitList),而不是binaryToDenary(noToConvert)

用於二進制的denary

def denaryToBinary(noStr): 
    #Works binary 
    doneListDen = [] 
    noToConvert = int(noStr) 
    while(noToConvert>0): 
     doneListDen.append(noToConvert%2) 
     noToConvert = noToConvert // 2 
    doneListDen.reverse() 
    print doneListDen 
+0

謝謝! - 1問題:這從bin到den的效果很好,但是從den到bin它打印出一堆亂碼:像大約100行:-322,8e-323,4e-323,2e-323,1e-323,5e -324 – user3207904

+0

我犯了一個錯誤。嘗試新的書房功能。 – afkfurion

+0

不幸的是仍然這樣做。 reverse()似乎什麼也沒做。感謝您的幫助,任何想法? – user3207904