【问题标题】:Sending null terminated string to my C code through Python通过 Python 将空终止字符串发送到我的 C 代码
【发布时间】:2021-10-06 08:12:30
【问题描述】:

我正在向我的 BPF C 代码发送字符串,但我不确定传入的字符串是否以空值结尾。如果他们不是,有没有办法让他们空终止?我正在将我的代码行发送到 BPF,以便我可以使用我的 stringCounter 函数手动计算它们,但我一直很遗憾地一直在循环。这是我的 Python 代码的样子:

b = BPF(src_file="hello.c")

lookupTable = b["lookupTable"]
#add hello.csv to the lookupTable array
f = open("hello copy.csv","r")
contents = f.readlines()
for i in range(0,len(contents)):
    string = contents[i].encode('utf-8')
    lookupTable[ctypes.c_int(i)] = ctypes.create_string_buffer(string, len(string))

这是我为我的空终止字符串计数器找到的代码

int stringLength(char* txt)
{
    int i=0,count=0;
    
    while(txt[i++]!='\0'){
        count+=1;
    }
    
    return count;
}

【问题讨论】:

  • 不相关:在那个函数中你只需要一个变量:int i = 0; for(; txt[i] != '\0'; ++i); return i; 顺便说一句,为什么不使用标准的strlen 函数?
  • 我正在编写 BPF 代码,因此不支持需要 string.h IIRC 的 strlen。
  • 什么是“BPF”?谷歌搜索只发现伯克利包过滤器,但不确定你在说什么。

标签: python c ctypes


【解决方案1】:

我不熟悉BPF,但对于ctypes,如果您的字符串没有被C 代码修改,则不需要create_string_buffer,因为它用于创建可变缓冲区,以及Python Unicode 和字节字符串总是分别以 nul 结尾的 wchar_t*char* 传递给 C 代码。假设你的函数在test.dlltest.so

import ctypes as ct

dll = ct.CDLL('./test')
dll.stringLength.argtypes = ct.c_char_p,
dll.stringLength.restype = ct.c_int

print(dll.stringLength('somestring'.encode()))  # If string is Unicode
print(dll.stringLength(b'someotherstring'))     # If already a byte string

输出:

10
15

请注意,这并不排除字符串本身包含 nul,但在这种情况下,您的 count 函数将返回一个较短的值:

print(dll.stringLength(b'some\0string'))  # Output: 4

假设不要求 BPF 对象具有硬编码的 ctypes 类型作为索引和值,您的代码可能会编写如下。

with open("hello copy.csv") as file:
    for i,line in enumerate(file):
        lookupTable[i] = string.encode()

【讨论】:

    【解决方案2】:

    ctypes.create_string_buffer(string, len(string)) 不是以零结尾的。但是ctypes.create_string_buffer(string) 是。很容易看出,因为ctypes.create_string_buffer(string)[-1]b'\x00',而ctypes.create_string_buffer(string, len(string))string 中的最后一个字节。

    换句话说,如果你想要一个以零结尾的缓冲区,让create_string_buffer 算出长度。 (它使用 Python 字节对象的实际长度,因此如果您担心的话,它不会被内部 NUL 字节所迷惑。)

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 2016-05-21
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      相关资源
      最近更新 更多