web-dev-qa-db-fra.com

Résolution des problèmes "TypeError: ord () chaîne attendue de longueur 1, mais int trouvée"

ERROR : TypeError: ord() expected string of length 1, but int found

J'obtiens cette erreur lors de la compilation du programme.

 File "C:\Users\Administrator\Desktop\tracer1.py", line 129, in <module>
    get_route("www.google.com")
  File "C:\Users\Administrator\Desktop\tracer1.py", line 85, in get_route
    d = build_packet()
  File "C:\Users\Administrator\Desktop\tracer1.py", line 62, in build_packet
    myChecksum = checksum(header + data)
  File "C:\Users\Administrator\Desktop\tracer1.py", line 28, in checksum
    thisVal = ord(str[count+1]) * 256 + ord(str[count])
**TypeError: ord() expected string of length 1, but int found**

le programme est de trouver la traceroute en utilisant ICMP

from socket import *
import socket
import os
import sys
import struct
import time
import select
import binascii
import ctypes
ICMP_ECHO_REQUEST = 8
MAX_Hops = 30
TIMEOUT = 2.0
TRIES = 2

# The packet that we shall send to each router along the path is the ICMP echo
# request packet, which is exactly what we had used in the ICMP ping exercise.
# We shall use the same packet that we built in the Ping exercise

ctypes.windll.Shell32.IsUserAnAdmin()
print (ctypes.windll.Shell32.IsUserAnAdmin())

def checksum(str):
    csum = 0
    countTo = (len(str) / 2) * 2
    count = 0

    while count < countTo:
        thisVal = ord(str[count+1]) * 256 + ord(str[count])
        csum = csum + thisVal
        csum = csum & 0xffffffff
        count = count + 2

    if countTo < len(str):
        csum = csum + ord(str[len(str) - 1])
        csum = csum & 0xffffffff

    csum = (csum >> 16) + (csum & 0xffff)
    csum = csum + (csum >> 16)
    answer = ~csum
    answer = answer & 0xffff
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer

def build_packet():
    # In the sendOnePing() method of the ICMP Ping exercise ,firstly the header of our
    # packet to be sent was made, secondly the checksum was appended to the header and
    # then finally the complete packet was sent to the destination.

    # Make the header in a similar way to the ping exercise.
    # Header is type (8), code (8), checksum (16), id (16), sequence (16)
    myChecksum = 0
    pid = os.getpid() & 0xFFFF

    # Make a dummy header with a 0 checksum.
    # struct -- Interpret strings as packed binary data
    header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, myChecksum, pid, 1)
    #header = struct.pack("!HHHHH", ICMP_ECHO_REQUEST, 0, myChecksum, pid, 1)
    data = struct.pack("d", time.time())

    # Calculate the checksum on the data and the dummy header.
    # Append checksum to the header.
    myChecksum = checksum(header + data)    
    if sys.platform == 'darwin':
        myChecksum = socket.htons(myChecksum) & 0xffff
        #Convert 16-bit integers from Host to network byte order.
    else:
        myChecksum = htons(myChecksum)

    packet = header + data
    return packet

def get_route(hostname):
    timeLeft = TIMEOUT
    for ttl in range(1,MAX_Hops):
        for tries in range(TRIES):
            destAddr = socket.gethostbyname(hostname)
            #Fill in start
            # Make a raw socket named mySocket
            mySocket = socket.socket(AF_INET, SOCK_RAW, getprotobyname("icmp"))
            mySocket.bind(("", 12000));
            #Fill in end
            mySocket.setsockopt(socket.IPPROTO_IP, socket.IP_TTL, struct.pack('I', ttl))
            mySocket.settimeout(TIMEOUT)
            try:
                d = build_packet()
                mySocket.sendto(d, (hostname, 0))
                t = time.time()
                startedSelect = time.time()
                whatReady = select.select([mySocket], [], [], timeLeft)
                howLongInSelect = (time.time() - startedSelect)
                if whatReady[0] == []: # Timeout
                    print ("*    *    * Request timed out.")

                recvPacket, addr = mySocket.recvfrom(1024)
                print ("addr")
                timeReceived = time.time()
                timeLeft = timeLeft - howLongInSelect
                if timeLeft <= 0:
                    print ("*    *    * Request timed out.")
            except socket.timeout:
                continue
            else:
                #Fill in start
                # Fetch the icmp type from the IP packet
                print( struct.calcsize("bbHHhd"))
                request_code, request_type, checksum, packet_id, \
                    sequence, timeSent, data = struct.unpack("bbHHhd", recvPacket,0)
                #Fill in end

                if request_type == 11:
                    bytes = struct.calcsize("d")
                    timeSent = struct.unpack("d", recvPacket[28:28 + bytes])[0]
                    print (" %d   rtt=%.0f ms %s" % (ttl,(timeReceived -t)*1000, addr[0]))
                Elif request_type == 3:
                    bytes = struct.calcsize("d")
                    timeSent = struct.unpack("d", recvPacket[28:28 + bytes])[0]
                    print (" %d   rtt=%.0f ms %s" % (ttl,(timeReceived -t)*1000, addr[0]))
                Elif request_type == 0:
                    bytes = struct.calcsize("d")
                    timeSent = struct.unpack("d", recvPacket[28:28 + bytes])[0]
                    print (" %d   rtt=%.0f ms %s" % (ttl,(timeReceived -timeSent)*1000, addr[0]))
                    return
                else:
                    print ("error")
                    break
            finally:
                mySocket.close()

get_route("www.google.com")
13
user2977469

Vous exécutez le script en utilisant Python 3 où l'indexation d'un objet bytes renvoie un entier:

>>> b"abc"[1]
98

Supprimez les appels ord(). Ils sont redondants dans ce cas.

25
jfs

J'ai rencontré aujourd'hui un type d'erreur similaire. J'ai ajouté cette réponse ici pour souligner certaines observations. L'API principale sur laquelle se concentrer est triple_des. Si l'entrée est qqq, cela provoquera l'erreur. Si l'entrée est sMAC, il n'y a pas d'erreur. Fait intéressant, qqq == sMAC Est true. De plus, l'impression des deux variables via binascii montre une valeur similaire. La variable qqq provient de bytearray.fromhex('7A414086D86A4BF5554AE6FBC4AC0465') et la variable sMAC provient de "7A414086D86A4BF5554AE6FBC4AC0465",decode('hex').

>>> qqq[0]
122
>>> sMAC[0]
'z'
>>> qqq == sMAC
True
>>> binascii.hexlify(sMAC)
'7a414086d86a4bf5554ae6fbc4ac0465'
>>> binascii.hexlify(qqq)
'7a414086d86a4bf5554ae6fbc4ac0465'
>>> qqq == sMAC
True
>>> repr(qqq)
"bytearray(b'zA@\\x86\\xd8jK\\xf5UJ\\xe6\\xfb\\xc4\\xac\\x04e')"
>>> repr(sMAC)
"'zA@\\x86\\xd8jK\\xf5UJ\\xe6\\xfb\\xc4\\xac\\x04e'"
>>> cipher1 = triple_des(qqq,CBC,"\0\0\0\0\0\0\0\0",pad=None,padmode=PAD_PKCS5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/john/.local/lib/python2.7/site-packages/pyDes.py", line 710, in __init__
    self.setKey(key)
  File "/home/john/.local/lib/python2.7/site-packages/pyDes.py", line 727, in setKey
    self._padding, self._padmode)
  File "/home/john/.local/lib/python2.7/site-packages/pyDes.py", line 409, in __init__
    self.setKey(key)
  File "/home/john/.local/lib/python2.7/site-packages/pyDes.py", line 414, in setKey
    self.__create_sub_keys()
  File "/home/john/.local/lib/python2.7/site-packages/pyDes.py", line 462, in __create_sub_keys
    key = self.__permutate(des.__pc1, self.__String_to_BitList(self.getKey()))
  File "/home/john/.local/lib/python2.7/site-packages/pyDes.py", line 421, in __String_to_BitList
    data = [ord(c) for c in data]
TypeError: ord() expected string of length 1, but int found
>>> cipher1 = triple_des(sMAC,CBC,"\0\0\0\0\0\0\0\0",pad=None,padmode=PAD_PKCS5)
>>>

J'espère que ce détail supplémentaire vous aidera.

0
typelogic