簡體   English   中英

是否有一個與Memcpy相當的Python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM