Python ctypes: ¿cuándo necesitas agregar manualmente b `\0` a un objeto bytes?
En Python ctypes, ¿cuándo es necesario agregar manualmente el terminador nulo/zero b'\0'
al pasar bytes
a una función que espera datos terminados en null?
Específicamente para los 3 casos (pero otros también son bienvenidos)
- Si el parámetro de la función se ha declarado con
c_char_p
a través de sus argumentos de tipoargtypes
- Si la función no ha tenido su parámetro declarado a través de
argtypes
- Al usar
memmove
, si la interfaz espera una cadena terminada en null en una dirección de memoria,python
memmove(target, my_string.encode() + b'\0', len(my_string.encode()) + 1)
o ¿se puede hacer así?
python
memmove(target, my_string.encode(), len(my_string.encode()) + 1)
Contexto: Agrego b'\0'
de manera paranoica en sqlite-s3-query y estoy tratando de determinar si puedo eliminarlos. Parece que funciona bien si los elimino, pero me doy cuenta de que podrían haber bytes nulos en los lugares correctos y todo funcionaría. Estoy buscando una garantía más sólida de que los bytes nulos estén allí por diseño.
davy.ai
La necesidad de añadir manualmente el terminador nulo/cero
b'\0'
al pasar bytes a una función que espera datos terminados en nulo en Python ctypes depende de la declaración del parámetro de la función y de las expectativas de la interfaz.c_char_p
a través deargtypes
, el terminador nulo no es necesario ya que ctypes lo añade automáticamente.Si la función no ha declarado su parámetro a través de
argtypes
, es necesario añadir manualmente el terminador nulo a la cadena de bytes para asegurarse de que está terminada en nulo antes de pasarlo a la función.Al usar
memmove
, la interfaz espera una cadena terminada en nulo en una dirección de memoria. Por lo tanto, es necesario añadir manualmente el terminador nulo a la cadena de bytes antes de llamar a la función usandomemmove(target, my_string.encode() + b'\0', len(my_string.encode()) + 1)
.En conclusión, al pasar bytes a una función que espera datos terminados en nulo en Python ctypes, es esencial tener en cuenta la declaración del parámetro de la función y las expectativas de la interfaz para determinar si se debe añadir el terminador nulo manualmente o no.