如果可以的话,如何强制 Socket 中的 recv() 不将我的十六进制值转换为 ASCII (python)
How do I force recv() in Socket to NOT convert my hex values into ASCII if it can (python)
我用的是python3.4的socket接口python-can。我遇到了一个问题,当我通过 recv() 或 recvfrom() 接收数据时,它会将消息中的一些十六进制数据转换为 ASCII,例如 '63' 变为 'c'。我不想要这个,我想要原始的十六进制数据。
这是代码的一部分:
def dissect_can_frame(frame):
can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
global dataS
dataS = data[:can_dlc]
return (can_id, can_dlc, data[:can_dlc])
s = socket.socket(socket.AF_CAN,socket.SOCK_RAW,socket.CAN_RAW)
print(s)
s.bind((can_interface,))
#s.bind((sys.argv[1],)) #used for 'can0' as argument at initial execution
print(socket.AF_CAN,",",socket.SOCK_RAW,",",socket.CAN_RAW)
#while True:
cf, addr = s.recvfrom(4096)
print(cf,',',addr)
我得到 "b'\x18c\xd8\xd6\x1f\x01 \x18'" 作为数据的输出部分,而不是“18 63 D8 D6 1F 01 20 18”。不要关心格式,但请注意“63”如何变成 'c',而“20”如何插入 space。我可以阻止它这样做吗?
套接字转换数据而不是生成原始数据是否常见?
感谢您的帮助。
这就是数据从 recv
出来时的样子。如果要将其转换为十六进制字符串,则可以在每个字符上使用 format
:
>>> s = b'\x18c\xd8\xd6\x1f\x01 \x18'
>>> " ".join(["{:02X}".format(ord(c)) for c in s])
'18 63 D8 D6 1F 01 20 18'
当然,对于实际对数据进行任何类型的分析来说,这是一种不方便的格式。但它看起来很适合展示目的。
或者,还有 hexlify
,但这并不 space 适合您的值:
>>> import binascii
>>> binascii.hexlify(s)
'1863d8d61f012018'
我用的是python3.4的socket接口python-can。我遇到了一个问题,当我通过 recv() 或 recvfrom() 接收数据时,它会将消息中的一些十六进制数据转换为 ASCII,例如 '63' 变为 'c'。我不想要这个,我想要原始的十六进制数据。
这是代码的一部分:
def dissect_can_frame(frame):
can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
global dataS
dataS = data[:can_dlc]
return (can_id, can_dlc, data[:can_dlc])
s = socket.socket(socket.AF_CAN,socket.SOCK_RAW,socket.CAN_RAW)
print(s)
s.bind((can_interface,))
#s.bind((sys.argv[1],)) #used for 'can0' as argument at initial execution
print(socket.AF_CAN,",",socket.SOCK_RAW,",",socket.CAN_RAW)
#while True:
cf, addr = s.recvfrom(4096)
print(cf,',',addr)
我得到 "b'\x18c\xd8\xd6\x1f\x01 \x18'" 作为数据的输出部分,而不是“18 63 D8 D6 1F 01 20 18”。不要关心格式,但请注意“63”如何变成 'c',而“20”如何插入 space。我可以阻止它这样做吗?
套接字转换数据而不是生成原始数据是否常见?
感谢您的帮助。
这就是数据从 recv
出来时的样子。如果要将其转换为十六进制字符串,则可以在每个字符上使用 format
:
>>> s = b'\x18c\xd8\xd6\x1f\x01 \x18'
>>> " ".join(["{:02X}".format(ord(c)) for c in s])
'18 63 D8 D6 1F 01 20 18'
当然,对于实际对数据进行任何类型的分析来说,这是一种不方便的格式。但它看起来很适合展示目的。
或者,还有 hexlify
,但这并不 space 适合您的值:
>>> import binascii
>>> binascii.hexlify(s)
'1863d8d61f012018'