python - xc3 - Convertir bytes rellenados en cero a la cadena UTF-8
u''/xf3'' (4)
¿Quizás podrías llamar a .replace(''/0'', '''')
y limpiarlos?
Estoy unpacking varias estructuras que contienen ''s''
campos de tipo ''s''
de C. Los campos contienen cadenas UTF-8 sin relleno manejadas por strncpy
en el código C (tenga en cuenta el comportamiento vestigial de esta función). Si decodifico los bytes, obtengo una cadena Unicode con muchos caracteres NUL
al final.
>>> b''hiya/0/0/0''.decode(''utf8'')
''hiya/x00/x00/x00''
Tenía la impresión de que los bytes de cero finales formaban parte de UTF-8 y se eliminarían automáticamente.
¿Cuál es la forma correcta de eliminar los bytes cero?
A diferencia de la solución de división / partición, esto no copia varias cadenas y puede ser más rápido para los bytearrays largos.
data = b''hiya/0/0/0''
i = data.find(b''/x00'')
if i == -1:
return data
return data[:i]
Use str.rstrip()
para eliminar los NULs finales:
>>> ''hiya/0/0/0''.rstrip(''/0'')
''hiya''
rstrip
o replace
solo funcionarán si la cadena se rellena hasta el final del búfer con nulos. En la práctica, para empezar, es posible que el búfer no se haya inicializado como nulo, por lo que podría obtener algo como b''hiya/0x/0''
.
Si sabe categóricamente al 100% que el código C comienza con un búfer inicializado nulo y nunca lo reutiliza, entonces puede encontrar que rstrip
es más simple, de lo contrario me gustaría algo más desordenado pero mucho más seguro:
>>> b''hiya/0x/0''.split(b''/0'',1)[0]
b''hiya''
que trata el primer nulo como terminador.