[英]is there a Python Equivalent to Memcpy
我試圖移植一些C代碼,但我真的卡住使用memcpy我嘗試用ctypes(沒有工作)。 我希望找到一種使用memcpy等效函數的python方法
有任何想法嗎
這是我嘗試移植的C代碼的示例
i = l + 5;
t = htons(atoi(port));
memcpy((buf+i), &t, 2);
您幾乎肯定不需要調用htons
然后將2個字節復制到緩沖區中 - 請參閱Keith的答案。
但是,如果你確實需要這樣做(也許你正在制作IP數據包來比較捕獲的線程數據包作為測試或什么?),你可以。
首先,如果您正在使用bytearray
(或任何其他符合可寫緩沖區協議的內容),您只需使用普通的list
-style切片賦值:
# like C's memcpy(buf+i, foo, 2)
buf[i:i+2] = foo
你沒有那個雙字節的字符串foo
; 你有一個短整數。 在C中,只需使用&
運算符獲取其地址,就可以將其轉換為指向兩個字節的指針,但Python無法做到這一點。 幸運的是,有一個名為struct
的標准庫模塊,專門用於此類事情:
t = socket.htons(int(port))
buf[i:i+2] = struct.pack('h', t)
或者,因為struct
可以為您處理字節序:
t = int(port)
buf[i:i+2] = struct.pack('!h', t)
但是,通常你甚至不需要緩沖區復制; 你可以在struct
中一次定義整個結構。 例如,如果您嘗試將IP地址和端口打包為6字節數組,則可以執行以下操作:
buf = bytearray(6)
i = 0
addrbytes = [int(part) for part in addr.split('.')]
buf[i:i+4] = struct.pack('4B', addrbytes[0], addrbytes[1], addrbytes[2], addrbytes[3])
i += 4
portshort = int(port)
buf[i:i+2] = struct.pack('!h', portshort)
但這更簡單:
addrbytes = [int(part) for part in addr.split('.')]
portshort = int(port)
buf = struct.pack('!4Bh', addrbytes[0], addrbytes[1], addrbytes[2], addrbytes[3], portshort)
我剛剛定義了一個網絡順序的結構,有四個字節后跟一個short,並將我的數據打包到其中。
最后要提一句:如果你真的想使用C風格的代碼處理C風格的變量,那么ctypes模塊是另一種選擇。 它專門用於與C代碼進行交互,因此通常它是相當低級的(並且標准庫中唯一允許您對代碼進行分段的模塊),但它可以讓您構建一些看起來更多的中級內容喜歡C:
class ADDRPORT(ctypes.BigEndianStructure):
_fields_ = [("addr", ctypes.c_char*4),
("port", ctypes.c_short)]
addrport = ADDRPORT(addrbytes, portshort)
由於您的C代碼逐漸填充緩沖區,而不是設置struct
元素,這可能不是您想要的。 但值得注意的是,因為它可能會在某些時候成為你想要的。
看起來您正在嘗試從用戶輸入或字符串中獲取端口號。
在Python中:
port = int(port)
然后你可以直接將它傳遞給套接字實例化:
socket = socket.socket(("127.0.0.1", port))
Python為你做了htons
翻譯。 您只需要為套接字(在TCP的情況下)提供一個地址作為字符串和整數的元組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.