Python 3.4: 未知格式代码 'x'
Python 3.4: Unknown format code 'x'
我对 Python3 中的数据包嗅探器有疑问。
python 版本:3.4
我遵循了一些有效的教程,但在我的计算机上无效。
此代码必须获取 mac 地址,将其转换为字符串,并且在 main() 方法中应向我打印目标 mac、源 mac 和协议。
代码:sniffer_demo.py
import socket
import struct
import textwrap
def main():
conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3))
while True:
raw_data, addr = conn.recvfrom(65536)
# one's and zero's put to the method ehternet_frame
dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)
print('\nEthernet Frame:')
print('Destination: {}, Source: {}, Protocol: {}'.format(dest_mac, src_mac, eth_proto))
# Unpack ethernet frame
def ethernet_frame(data):
dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14])
return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:]
# Return properly formatted MAC address: (ie AA:BB:CC:DD:EE:FF)
def get_mac_addr(bytes_addr):
bytes_str = map('{:02x}'.format, bytes_addr)
return ':'.join(bytes_str).upper()
main()
错误是:
Traceback (most recent call last):
File "sniffer_demo.py", line 28, in <module>
main()
File "sniffer_demo.py", line 11, in main
dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)
File "sniffer_demo.py", line 19, in ethernet_frame
return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:]
File "sniffer_demo.py", line 24, in get_mac_addr
bytes_str = map('{:02x}'.format, bytes_addr)
ValueError: Unknown format code 'x' for object of type 'str'
如何解决?
在尝试重现时,您的代码似乎完全按预期工作。我没有看到任何 shebang-line。您确定您正在使用 python3
执行吗?
来自 # python3.4 snif2.py
的示例输出:
Ethernet Frame:
Destination: A4:17:31:xx:xx:xx, Source: 00:0C:F6:xx:xx:xx, Protocol: 8
Ethernet Frame:
Destination: 00:0C:F6:xx:xx:xx, Source: A4:17:31:xx:xx:xx, Protocol: 8
^CTraceback (most recent call last):
File "snif2.py", line 27, in <module>
main()
File "snif2.py", line 9, in main
raw_data, addr = conn.recvfrom(65536)
KeyboardInterrupt
将您的 Python 更新到版本 3.6。
我对 Python3 中的数据包嗅探器有疑问。
python 版本:3.4
我遵循了一些有效的教程,但在我的计算机上无效。 此代码必须获取 mac 地址,将其转换为字符串,并且在 main() 方法中应向我打印目标 mac、源 mac 和协议。
代码:sniffer_demo.py
import socket
import struct
import textwrap
def main():
conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3))
while True:
raw_data, addr = conn.recvfrom(65536)
# one's and zero's put to the method ehternet_frame
dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)
print('\nEthernet Frame:')
print('Destination: {}, Source: {}, Protocol: {}'.format(dest_mac, src_mac, eth_proto))
# Unpack ethernet frame
def ethernet_frame(data):
dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14])
return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:]
# Return properly formatted MAC address: (ie AA:BB:CC:DD:EE:FF)
def get_mac_addr(bytes_addr):
bytes_str = map('{:02x}'.format, bytes_addr)
return ':'.join(bytes_str).upper()
main()
错误是:
Traceback (most recent call last):
File "sniffer_demo.py", line 28, in <module>
main()
File "sniffer_demo.py", line 11, in main
dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)
File "sniffer_demo.py", line 19, in ethernet_frame
return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:]
File "sniffer_demo.py", line 24, in get_mac_addr
bytes_str = map('{:02x}'.format, bytes_addr)
ValueError: Unknown format code 'x' for object of type 'str'
如何解决?
在尝试重现时,您的代码似乎完全按预期工作。我没有看到任何 shebang-line。您确定您正在使用 python3
执行吗?
来自 # python3.4 snif2.py
的示例输出:
Ethernet Frame:
Destination: A4:17:31:xx:xx:xx, Source: 00:0C:F6:xx:xx:xx, Protocol: 8
Ethernet Frame:
Destination: 00:0C:F6:xx:xx:xx, Source: A4:17:31:xx:xx:xx, Protocol: 8
^CTraceback (most recent call last):
File "snif2.py", line 27, in <module>
main()
File "snif2.py", line 9, in main
raw_data, addr = conn.recvfrom(65536)
KeyboardInterrupt
将您的 Python 更新到版本 3.6。