是否有一个与Memcpy相当的Python

tow*_*ong 4 c python memcpy

我试图移植一些C代码,但我真的卡住使用memcpy我尝试用ctypes(没有工作).我希望找到一种使用memcpy等效函数的python方法

有任何想法吗

这是我尝试移植的C代码的示例

i = l + 5;
t = htons(atoi(port));
memcpy((buf+i), &t, 2);
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 7

你几乎肯定不需要调用htons然后将2个字节复制到缓冲区 - 请参阅Keith的答案.

但是,如果你确实需要这样做(也许你正在制作IP数据包来比较捕获的线程数据包作为测试或什么?),你可以.

首先,如果您使用的是bytearray(或其他任何符合可写缓冲区协议的内容),您只需使用普通list样式的切片赋值:

# like C's memcpy(buf+i, foo, 2)
buf[i:i+2] = foo
Run Code Online (Sandbox Code Playgroud)

你没有那个双字节的字符串foo; 你有一个短整数.在C中,只需使用&运算符获取其地址,就可以将其转换为指向两个字节的指针,但Python无法做到这一点.幸运的是,有一个标准的库模块,struct专门为这种事情而设计:

t = socket.htons(int(port))
buf[i:i+2] = struct.pack('h', t)
Run Code Online (Sandbox Code Playgroud)

或者,因为struct可以为您处理字节顺序:

t = int(port)
buf[i:i+2] = struct.pack('!h', t)
Run Code Online (Sandbox Code Playgroud)

但是,通常你甚至不需要缓冲区复制; 你可以在里面一次定义整个结构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)
Run Code Online (Sandbox Code Playgroud)

但这更简单:

addrbytes = [int(part) for part in addr.split('.')]
portshort = int(port)
buf = struct.pack('!4Bh', addrbytes[0], addrbytes[1], addrbytes[2], addrbytes[3], portshort)
Run Code Online (Sandbox Code Playgroud)

我刚刚定义了一个网络顺序的结构,有四个字节后跟一个short,并将我的数据打包到其中.

最后要提一句:如果你真的想使用C风格的代码处理C风格的变量,那么ctypes模块是另一种选择.它专门用于与C代码进行交互,因此通常它是相当低级的(并且标准库中唯一允许您对代码进行分段的模块),但它可以让您构建一些看起来更多的中级内容喜欢C:

class ADDRPORT(ctypes.BigEndianStructure):
    _fields_ = [("addr", ctypes.c_char*4),
                ("port", ctypes.c_short)]

addrport = ADDRPORT(addrbytes, portshort)
Run Code Online (Sandbox Code Playgroud)

由于你的C代码逐渐填充缓冲区,而不是设置a的元素struct,这可能不是你想要的.但值得注意的是,因为它可能会在某些时候成为你想要的.


Kei*_*ith 6

看起来您正在尝试从用户输入或字符串中获取端口号.

在Python中:

port = int(port)
Run Code Online (Sandbox Code Playgroud)

然后你可以直接将它传递给套接字实例化:

socket = socket.socket(("127.0.0.1", port))
Run Code Online (Sandbox Code Playgroud)

Python htons为您完成翻译.您只需要为套接字(在TCP的情况下)提供一个地址作为字符串和整数的元组.