Troubleshooting "TypeError: ord() expected string of length 1, but int found"
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.
user2977469
Updated on August 03, 2022Comments
-
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")