2012-04-11 141 views
3

我知道爲了通過UDP套接字使用python發送數據必須採用以下格式「\ x41」= A。通過UDP或TCP套接字通過參數傳遞給腳本發送十六進制值

我有一個python腳本udp_send.py,我想在一個十六進制值發送給代表在服務器端的寄存器值。

我通過linux終端運行我的腳本>> python udp_send.py「\ x41」。我在我的python腳本中使用argv [1]讀取變量。我做了一個len檢查,結果是3。它忽略\,並將x,4和1分別作爲1個字節,而我只希望\ x41僅表示1個字節。

我當時試圖連接數據=「\ x」+「41」,但它沒有工作。

「\ x」被解釋爲由python轉義。我試圖找到一種方法將十六進制值傳入我的腳本並通過UDP套接字發送它?

我已經實現了以下目標。通過UDP套接字發送在python腳本中定義的十六進制值。

from socket import * 
from sys import * 

## Set the socket parameters 
host = <ip-define-here> 
port = <port-define-here> 
buf = 1024 
addr = (host,port) 

## Create socket 
UDPSock = socket(AF_INET,SOCK_DGRAM) 

## Send messages 
data ='\x41' 
#data=argv[1] #commented out 
if not data: 
    print "No data" 
else: 
    if(UDPSock.sendto(data,addr)): 
     print "Sending message ",data 

## Close socket 
UDPSock.close() 

我在服務器端使用wireshark並看到十六進制值41出現。

只要是明確的「41」(由2個字節)是不一樣的在python「\ X41」(只有一個字節)。我的簡單問題是,如何將字符「41」與「\ x」結合以形成「\ x41」,以便我可以將它分配給我的python腳本中的數據變量,以便我可以將它發送爲十六進制值41.

回答

3

在您的代碼,您可以將ARG轉換成合適的格式,那麼你就可以python udp_send.py 0x41

arg = sys.argv[1] 

# intarg = 65 == 0x41 
intarg = int(arg, 16) 

# now convert to byte string '\x41' 
hexstring = struct.pack('B', intarg) 
+0

非常感謝。正是我在找什麼。我知道存在一種包裝方法,只是不知道如何使用它。再一次感謝你。 – 2012-04-11 21:57:35

+0

除了struct.pack,你還可以使用'chr(intarg)'。 – jcdyer 2012-04-17 14:41:13

1

您正在使您的問題比您需要的更加複雜。字符已包含其字節值。你應該能夠傳遞字符串'A',並且一切都會正常工作。

首先,Python中'\ x41'和'A'沒有區別。兩者都代表由字節0x41組成的一個字符串。 (或二進制0100 0001。任何你可以使用的地方(在python中),你可以使用另一個。問題在於shell是如何在將它傳遞給python之前解析你的字符串的,shell會看到反斜槓,嘗試爲逃避下一個字符,失敗(因爲\ x不是一個有效的shell轉義),通過通過非轉義,然後傳遞字符41所以python接收由字符 41組成的三個字符的字符串。如果你想通過反斜槓,你需要轉義它,但不會達到你想要的效果,然後python會得到一個由字符\,x,41組成的四字節字符串。 '\\x4a',如果你打印它,它w看起來像\x4a

爲了得到一個字節的值0x41,使用字符A

+0

感謝jcdyer以上答案調用它。不過,我想發送不同的十六進制值在服務器端的不同的寄存器地址。如果我想發送「\ xAA」或「x01」或「\ x0F」,它們不能像字符'A'那樣用字符「\ x41」完全定義。所以我想發送十六進制值給python並通過udp端口發送出去。 – 2012-04-11 21:35:53

+0

啊,是的。然後做另一個答案。 :) – jcdyer 2012-04-17 14:39:51

相關問題