I try to use struct.pack but i get the next exception when i run it:
Traceback (most recent call last):
File "a_sdk.py", line 36, in <module>
a.get_time(1)
File "a_sdk.py", line 25, in get_controller_time
self._s.connect()
File "C:sdkss.py", line 55, in connect
msg_connect = protocol_Connect(self.sp_name)
File "C:sdksuntils.py", line 39, in
protocol_Connect
return struct.pack(connection_struct, 4, 0, 0, 0, name_len, connect_name)
struct.error: argument for 's' must be a bytes object
the code that i run:
def protocol_Connect(connect_name):
name_len = len(connect_name)
connection_struct = f'!5B{name_len}s'.encode('utf-8')
return struct.pack(connection_struct, 4, 0, 0, 0, name_len, connect_name)
I try to send the connection_struct as str and also as a bytes using encode.
Advertisement
Answer
The {name_len}s in your connection_struct specifies that you will pass {name_len} number of chars so when you call struct.pack() the last argument is expected to be of bytes of length {name_len}
To solve the struct.error convert connect_name from type string to byte and connection_struct can be either bytes or strings:
def protocol_Connect(connect_name):
connect_name=str.encode(connect_name)
# or connect_name = connect_name.encode('utf-8')
name_len = len(connect_name)
connection_struct = f'!5B{name_len}s'
return struct.pack(connection_struct, 4, 0, 0, 0, name_len, connect_name)