2016-07-19 2 views
1

私はPythonでプログラムに取り組んでいますし、すべてのコードは私が次のエラーメッセージを取得していますターミナルからプログラムを実行する場合を除いてよさそうだ。ここでは不明な書式コードの「x」

Traceback (most recent call last): 
    File "packetSniffer.py", line 25, in <module> 
    main() 
    File "packetSniffer.py", line 10, in main 
    reciever_mac, sender_mac, ethernetProtocol, data = ethernet_frame(rawData) 
    File "packetSniffer.py", line 17, in ethernet_frame 
    return getMacAddress(reciever_mac), getMacAddress(sender_mac), socket.htons(protocol), data[14:] 
    File "packetSniffer.py", line 21, in getMacAddress 
    bytesString = map('{:02x}'.format, bytesAddress) 
ValueError: Unknown format code 'x' for object of type 'str' 

ですこれまでの私のプログラム全体のコードは誰でも手伝ってくれますか?次のコードセクションで

import struct 
import textwrap 
import socket 

def main(): 
    connection = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3)) 

    while True: 
     rawData, address = connection.recvfrom(65535) 
     reciever_mac, sender_mac, ethernetProtocol, data = ethernet_frame(rawData) 
     print('\nEthernet Frame: ') 
     print('Destination: {}, Source: {}, Protocol: {}'.format(reciever_mac, sender_mac, ethernetProtocol)) 

# Unpack ethernet frame 
def ethernet_frame(data): 
    reciever_mac, sender_mac, protocol = struct.unpack('! 6s 6s H', data[:14]) 
    return getMacAddress(reciever_mac), getMacAddress(sender_mac), socket.htons(protocol), data[14:] 

# Convert the Mac address from the jumbled up form from above into human readable format 
def getMacAddress(bytesAddress): 
    bytesString = map('{:02x}'.format, bytesAddress) 
    macAddress = ':'.join(bytesString).upper() 
    return macAddress 

main() 
+0

これはPython 3であることは間違いありませんか? – Will

+0

ここから来ているようです:https://github.com/koehlma/snippets/blob/master/python/network/sniffer.py https://stackoverflow.com/questions/34968090/python-3-4- unknown-format-code-x – Will

答えて

3

format typexは、文字列を期待していません。整数を受け入れます。その後、整数を対応する16進数形式に変換します。

# Convert the Mac address from the jumbled up form from above into human readable format 
def getMacAddress(bytesAddress): 
    bytesString = map('{:02x}'.format, bytesAddress) 
    macAddress = ':'.join(bytesString).upper() 

あなたbytestAddressが整数の文字列形式であれば、それから、あなたができる:

さらに
bytesAddress = '123234234' 
map('{:02x}'.format, [int(i) for i in bytesAddress]) 
#map('{:02x}'.format, map(int, bytesAddress)) 
['01', '02', '03', '02', '03', '04', '02', '03', '04'] 

を、あなたは(文字列形式で)整数のペアを処理したい場合は16進数に、最初に `bytesAddressを

に変換します。
[bytesAddress[i:i+2] for i in range(0, len(bytesAddress), 2)] 
関連する問題