- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试移植一些 C 代码,但由于使用 memcpy 我尝试使用 ctypes(没有用),我真的卡住了。我希望找到一种使用 memcpy 等效函数的 python 方法
任何想法
这是我尝试移植的 C 代码示例
i = l + 5;
t = htons(atoi(port));
memcpy((buf+i), &t, 2);
最佳答案
您几乎可以肯定不需要调用 htons
然后将 2 个字节复制到缓冲区中——请参阅 Keith 的回答以了解原因。
但是,如果您确实需要这样做(也许您正在制作 IP 数据包以与捕获的有线数据包进行比较作为测试或其他什么?),您可以。
首先,如果您使用的是 bytearray
(或任何其他符合可写缓冲区协议(protocol)的东西),您只需使用普通的 list
样式的切片分配:
# 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)
我刚刚定义了一个按网络顺序排列的结构,四个字节后跟一个短字符,并将我的数据打包到其中。
最后要提的一件事:如果你真的想使用 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 - 有没有等同于 Memcpy 的 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689628/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
在现代 IDE 中,有一个键盘快捷键可以通过键入文件名称来打开文件,而无需将手放在鼠标上。例如: Eclipse:Cmd|Ctrl + Shift + R -> 打开资源 IntelliJ:Cmd|C
有什么东西会等待事件发生(我正在等待的是 WebBrowser.DocumentCompleted),然后执行代码吗?像这样: If (WebBrowser.DocumentCompleted) 不会
我使用 PHP Minify,它很棒。但我的问题是,是否有任何 PHP 插件或其他东西可以自动检测 javascript/css 代码并自动缩小它?谢谢。 最佳答案 Javascript 压缩器? 看
有没有一种语言,类似什么CoffeeScript是JavaScript,编译成windows batch|cmd|command line的语言? 我指的cmd版本是基于NT的,尤其是XP sp3及以
我知道我可以 ,但是,我真的宁愿有一个任务,我可以从任何可以使用所有(或至少大部分)属性的操作系统调用 copy ,但这并没有消除 unix 上的权限。 我想知道是否已经有解决方案,或者我必须自己编
我正在使用 Vuejs(不使用 jQuery)开发一个项目,该项目需要像 jvectormap 这样的 map 但正如我所说,我没有使用 jQuery,那么是否有任何其他库可以在不使用 jQuery
想要进行一个简单的民意调查,甚至不需要基于 cookie,我不在乎投了多少票。有没有类似的插件或者简单的东西? 最佳答案 这是一个有用的教程 - 让我知道它是否适合您 using jQuery to
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
var FileBuff: TBytes; Pattern: TBytes; begin FileBuff := filetobytes(filename); Result := Co
我想要一个 vqmod xml 文件来添加一次上传多个图像的功能。身边有这样的事吗? 编辑:Opencart版本:2.1.0.1 最佳答案 最后我写了一个xml来添加到opencart 2.1.0.1
所以考虑这样的函数: public void setTemperature(double newTemperatureValue, TemperatureUnit unit) 其中Temperatur
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我是 ggplot2 的新手,一直在尝试找到一个全面的美学列表。我想我理解它们的目的,但很难知道哪些可以在各种情况下使用(主要是几何图形?)。 Hadley 的网站偶尔会在各个几何图形的页面上列出可用
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
是否有任何 PHP 函数可以将整数转换为十万和千万? 900800 -> 9,00,800 500800 -> 5,00,800 最佳答案 由于您已在问题标签中添加了 Yii,因此您可以按照 Yii
使用 Clojure 一段时间后,我积累了一些关于它的惰性的知识。我知道诸如map之类的常用API是否是惰性的。然而,当我开始使用一个不熟悉的API(例如with-open)时,我仍然感到怀疑。 是否
我的项目需要一个像 AvalonDock 这样的对接系统,但它的最后一次更新似乎是在 2013 年 6 月。是否有更多...积极开发的东西可以代替它? 最佳答案 AvalonDock 实际上相当成熟并
我正在寻找一个可以逆转 clojure 打嗝的函数 所以 turns into [:html] 等等 根据@kotarak的回答,这现在对我有用: (use 'net.cgrand.enliv
我是一名优秀的程序员,十分优秀!