¿Hay alguna forma de copiar bytes nulos (ASCII 0x00) al portapapeles en Windows?

14

Los bytes nulos (ASCII 0x00) no parecen ser copiables (Ctrl + C-able) en Windows. Para una demostración de esto, abra la consola de desarrollo de su navegador y hágalo console.log('a\x00b'). Si intenta copiar y pegar la cadena resultante en una máquina con Windows 8 (y probablemente también en otras versiones de Windows), encontrará que solo ase copia. El \x00y todo lo demás después se ignora.

¿Hay alguna forma de copiar la totalidad de una cadena que contiene bytes nulos? ¿Puede el portapapeles incluso contener bytes nulos?

(Pregunta auxiliar: ¿por qué no se pueden copiar bytes nulos? Por ejemplo, ¿hay alguna razón relacionada con la seguridad para esto o solo Windows es una tontería?)

senshin
fuente
buena pregunta ... sea interesante ver si lo está poniendo en el portapapeles xxd puede generar nulos C:\>echo 000000| xxd -r -p|xxd -p<ENTER> 000000 C:\>echo 000000| xxd -r -p|clip<ENTER> >
barlop
usando unxutils gclip y pclip C:\>echo 000000| xxd -r -p|gclip<ENTER> C:\>pclip|xxd -p<ENTER> C:\>pclip>a.a<ENTER> <- no me queda claro si los valores nulos van al portapapeles ... o si están dentro pero no se están pegando.
barlop
2
En algún lugar de la cadena, un programa está utilizando funciones / representaciones de cadena terminadas en nulo (es decir, funciones de cadena C). Muy común. Mi escaso conocimiento de tales cosas es "sí", existen posibles problemas de seguridad con los nulos de incrustación, principalmente debido a la posible identificación errónea de la longitud de la cadena y el desbordamiento del búfer (??).
Yorik
Es un acertijo: copié el contenido de un JPG en el portapapeles, y cuando lo leí nuevamente se truncó en el primer nulo, lo que sugiere que el portapapeles está basado en texto. Sin embargo, puedo volcar la pantalla o cortar y pegar imágenes entre paquetes de gráficos sin ningún problema.
AFH
Supongo que depende del formato utilizado. Portapapeles compatible con diferentes formatos. Si copia texto, lo más probable es que los caracteres nulos no sean compatibles porque se usan como terminador de cadena. Si usa un formato de portapapeles binario, puede copiar y pegar bytes nulos.
Alexey Ivanov

Respuestas:

10

No, no puede colocar texto con caracteres nulos incrustados en el portapapeles. Veamos la lista de formatos estándar de portapapeles de Windows . Hay algunos formatos que contienen cosas generalmente entendidas como texto:

  • CF_TEXT (1)
  • CF_OEMTEXT (7)
  • CF_UNICODETEXT (13)

Cada uno de esos tiene esta oración en su definición:

Un carácter nulo señala el final de los datos.

Ahora, CF_UNICODETEXT mantiene sus datos como UTF-16LE , por lo que es muy probable que tenga algunos bytes nulos , pero los caracteres nulos (dos bytes nulos en una fila, básicamente) aún terminarán la cadena.

Solo podemos especular sobre por qué los caracteres nulos no están permitidos en el texto del portapapeles, pero es más que probable que sea solo porque las funciones de procesamiento de cadenas más utilizadas en Windows suponen que un carácter nulo señala el final. La única otra forma de saber dónde se detiene una cadena sería prefijarla con su longitud.

Puede mantener gráficos en el portapapeles aunque probablemente tengan bytes nulos porque se pasan en diferentes formatos de portapapeles (por ejemplo CF_BITMAP), que los programas deben entender de manera diferente.

Ben N
fuente
Gracias, gran respuesta. Definitivamente aprendí algunas cosas buenas sobre el portapapeles de Windows.
senshin