将字符串作为c_ubyte数组传递给C

皮格马利翁

C我有一个函数,期望unsigned chars的数组

void writedata(unsigned char *datapos, int datanum)

我想改为从Python传递标准字符串

writedata = parallel.writedata
writedata.argtypes = [POINTER(c_ubyte), c_int]

a = "test string"
writedata(a, 11)

据我了解,字符串实际上是字节/字符的数组,并且a是一个指针。但是,ctypes不同意:

ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: expected LP_c_ubyte instance instead of str

如何从字符串中获取“真实”指针?

编辑:David Cullen提供了一个将字符串指针作为参数的解决方案:

writedata.argtypes = [c_char_p, c_int]

很好,但是我想同时向函数提供byte数组string这意味着这也应该起作用

ll = [0,1,2,3,4,5,6,7]
uints = (c_ubyte*8)(*ll)
writedata(uints, 8)

我很好奇为什么不能两者都做,因为就内存而言,我认为字节数组和字符串应该相同?也许这与指针转换有关?

我也尝试ctypes建立到同一C功能的两个连接,但这不起作用。

解决方案:我重新制定了问题,并在这里得到了最佳答案:

https://stackoverflow.com/a/64838842/2957687

大卫·卡伦

如果我们转换字符串以匹配所需的参数类型,则可以使用相同的函数:

def writedata(value):
    if isinstance(value, str):
        value = (ctypes.c_ubyte * len(value)) (*bytearray(value))
    writedataf(value, len(value))

为了验证我的理论,我创建了一个非常简单的库:

#include <stdio.h>

void writedata(unsigned char *datapos, int datanum) {
    for (int index = 0; index < datanum; index++) {
        putchar(datapos[index]);
    }
    putchar('\n');
}

我使用创建了一个macOS共享库

clang -Wall -Werror -shared -fpic main.c -o libwritedata.so

我将共享库复制到其中/usr/local/lib并创建了此Python脚本:

import ctypes

writedataf = ctypes.CDLL('/usr/local/lib/libwritedata.so').writedata
writedataf.argtypes = [ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int]

def writedata(value):
    if isinstance(value, str):
        value = (ctypes.c_ubyte * len(value)) (*bytearray(value))
    writedataf(value, len(value))

x = "a short string"
writedata(x)
uints = (ctypes.c_ubyte * len(x)) (*bytearray(x))
writedata(uints)

输出量

a short string
a short string

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将字符串作为c_ubyte数组传递给C

来自分类Dev

将C#字符串数组传递给C ++

来自分类Dev

将字符串数组传递给C中的函数

来自分类Dev

C ++将字符串数组传递给函数

来自分类Dev

如何将字符串数组指针传递给新的字符数组?在 C

来自分类Dev

将C字符串数组传递给Fortran(iso_c_binding)

来自分类Dev

使用Swig将numpy字符串数组传递给C

来自分类Dev

如何将Swift字符串数组传递给带有char **参数的C函数

来自分类Dev

通过jQuery AJAX将字符串数组传递给C#WebMethod

来自分类Dev

C ++:在不使用向量的情况下将字符串数组传递给函数

来自分类Dev

c#将多行字符串传递给函数并返回数组

来自分类Dev

使用Swig将numpy字符串数组传递给C

来自分类Dev

LuaJIT ffi:如何将字符串数组传递给c函数

来自分类Dev

将字符串作为数组传递给子程序并返回特定字符的计数

来自分类Dev

将字符串文字传递给C

来自分类Dev

C结构;克服将字符串传递给char

来自分类Dev

将C ++字符串传递给ac#函数

来自分类Dev

将指针(字符串)传递给C函数

来自分类Dev

C 将字符串传递给函数问题

来自分类Dev

将swift字符串传递给c函数char *

来自分类Dev

为什么将C字符串作为char *传递给函数会导致运行时错误(但将定义为char []的C字符串传递是可以的)?

来自分类Dev

C-将字符串数组作为函数参数传递

来自分类Dev

数组作为字符串传递给ajax

来自分类Dev

将字符串数组作为参数传递给asp.net mvc webapi方法

来自分类Dev

将2D数组和字符串向量作为参数传递给函数

来自分类Dev

如何将bash变量作为字符串而不是数组传递给scala文件

来自分类Dev

为什么JS将数字作为字符串传递给数组?

来自分类Dev

我如何将列表,数组或字符串作为参数传递给redshift

来自分类Dev

将字符串数组作为POST传递给PHP脚本

Related 相关文章

  1. 1

    将字符串作为c_ubyte数组传递给C

  2. 2

    将C#字符串数组传递给C ++

  3. 3

    将字符串数组传递给C中的函数

  4. 4

    C ++将字符串数组传递给函数

  5. 5

    如何将字符串数组指针传递给新的字符数组?在 C

  6. 6

    将C字符串数组传递给Fortran(iso_c_binding)

  7. 7

    使用Swig将numpy字符串数组传递给C

  8. 8

    如何将Swift字符串数组传递给带有char **参数的C函数

  9. 9

    通过jQuery AJAX将字符串数组传递给C#WebMethod

  10. 10

    C ++:在不使用向量的情况下将字符串数组传递给函数

  11. 11

    c#将多行字符串传递给函数并返回数组

  12. 12

    使用Swig将numpy字符串数组传递给C

  13. 13

    LuaJIT ffi:如何将字符串数组传递给c函数

  14. 14

    将字符串作为数组传递给子程序并返回特定字符的计数

  15. 15

    将字符串文字传递给C

  16. 16

    C结构;克服将字符串传递给char

  17. 17

    将C ++字符串传递给ac#函数

  18. 18

    将指针(字符串)传递给C函数

  19. 19

    C 将字符串传递给函数问题

  20. 20

    将swift字符串传递给c函数char *

  21. 21

    为什么将C字符串作为char *传递给函数会导致运行时错误(但将定义为char []的C字符串传递是可以的)?

  22. 22

    C-将字符串数组作为函数参数传递

  23. 23

    数组作为字符串传递给ajax

  24. 24

    将字符串数组作为参数传递给asp.net mvc webapi方法

  25. 25

    将2D数组和字符串向量作为参数传递给函数

  26. 26

    如何将bash变量作为字符串而不是数组传递给scala文件

  27. 27

    为什么JS将数字作为字符串传递给数组?

  28. 28

    我如何将列表,数组或字符串作为参数传递给redshift

  29. 29

    将字符串数组作为POST传递给PHP脚本

热门标签

归档