En Python ctypes, ¿cuándo, si alguna vez, necesita agregar manualmente el terminador nulo/cero b'\0' al pasar bytes a una función que espera datos terminados en nulo?
Específicamente para los 3 casos (pero otros bienvenidos)
Si el parámetro de la función ha sido declarado con c_char_p a través de sus argtypes
Si la función no ha tenido su parámetro declarado a través de argtypes
Usando memmove , si la interfaz espera una cadena terminada en nulo en una dirección de memoria,
memmove(target, my_string.encode() + b'\0', len(my_string.encode()) + 1)o puedes hacer
memmove(target, my_string.encode(), len(my_string.encode()) + 1) Contexto: agrego b'\0' por paranoia en sqlite-s3-query y trato de averiguar si puedo eliminarlos. Parece funcionar bien si los elimino, pero me doy cuenta de que podría haber bytes nulos en los lugares correctos, por lo que todo funciona. Estoy buscando una garantía más fuerte de que los bytes nulos están ahí por diseño.
Al menos en CPython, el búfer interno para un objeto de bytes siempre termina en nulo y no es necesario agregar otro. Ya sea que especifique .argtypes o no, el puntero generado apuntará a este búfer.
Referencia: https://docs.python.org/3/c-api/bytes.html#c.PyBytes_AsString :
char * PyBytes_AsString (PyObject *o)
Parte del Estable ABI.
Devuelve un puntero al contenido de o . El puntero se refiere al búfer interno de o, que consta delen(o) + 1bytes. El último byte en el búfer siempre es nulo, independientemente de si hay otros bytes nulos...