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

58,636

Solution 1

You are running the script using Python 3 where indexing a bytes object returns an integer:

>>> b"abc"[1]
98

Remove the ord() calls. They are redundant in this case.

Solution 2

I encountered today a similar type of error. I added this answer here to highlight certain observations. The main API to focus here is triple_des. If the input is qqq, then it will cause the error. If the input is sMAC, then there is no error. Interestingly, qqq == sMAC is true. Furthermore, both variable's print via binascii shows similar value. Variable qqq came from bytearray.fromhex('7A414086D86A4BF5554AE6FBC4AC0465') and variable sMAC came from "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)
>>>

Hope this additional detail helps.

Share:
58,636
user2977469
Author by

user2977469

Updated on August 03, 2022

Comments

  • user2977469
    user2977469 almost 2 years
    ERROR : TypeError: ord() expected string of length 1, but int found
    

    I am getting this error while compiling the program.

     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**
    

    the program is to find the traceroute using 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")