Existe alguma maneira de copiar bytes nulos (ASCII 0x00) para a área de transferência no Windows?

14

Bytes nulos (ASCII 0x00) não parecem ser copiáveis ​​(compatíveis com Ctrl + C) no Windows. Para uma demonstração disso, abra o console de desenvolvimento do seu navegador e faça console.log('a\x00b'). Se você tentar copiar e colar a sequência resultante em uma máquina Windows 8 (e provavelmente outras versões do Windows também), verá que apenas as acópias são copiadas. O \x00e tudo depois que é ignorado.

Existe alguma maneira de copiar a totalidade de uma string que contém bytes nulos? A área de transferência pode conter bytes nulos?

(Pergunta auxiliar: por que os bytes nulos não podem ser copiados? Por exemplo, existe um motivo relacionado à segurança para isso ou apenas o Windows é bobo?)

senshin
fonte
boa pergunta .. ser interessante ver se ele é colocá-lo nos nulos saída xxd lata da área de transferência C:\>echo 000000| xxd -r -p|xxd -p<ENTER> 000000 C:\>echo 000000| xxd -r -p|clip<ENTER> >
barlop
usando unxutils gclip e pclip C:\>echo 000000| xxd -r -p|gclip<ENTER> C:\>pclip|xxd -p<ENTER> C:\>pclip>a.a<ENTER> <- não está claro para mim se os nulos estão entrando na área de transferência .. ou se estão dentro, mas não estão colando.
barlop
2
Em algum lugar da cadeia, um programa está usando funções / representações de string terminadas em nulo (ou seja, funções de string C). Muito comum. Meu escasso entendimento de tais coisas é "sim", há problemas de segurança em potencial com a incorporação de nulos, principalmente devido ao potencial de identificação incorreta do comprimento da string e do estouro de buffer (??).
Yorik
É um enigma: copiei o conteúdo de um JPG para a área de transferência e, quando o li novamente, ele foi truncado no primeiro nulo, o que sugere que a área de transferência é baseada em texto. No entanto, posso filtrar o dump ou cortar e colar imagens entre pacotes gráficos sem problemas.
AFH
Eu acho que depende do formato usado. A área de transferência suporta diferentes formatos. Se você copiar texto, provavelmente os caracteres nulos não serão suportados porque são usados ​​como terminador de sequência. Se você usar um formato binário da área de transferência, poderá copiar e colar bytes nulos.
Alexey Ivanov

Respostas:

10

Não, você não pode colocar texto com caracteres nulos incorporados na área de transferência. Vejamos a lista de formatos padrão da área de transferência do Windows . Existem alguns formatos que mantêm coisas geralmente entendidas como texto:

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

Cada um deles tem esta frase em sua definição:

Um caractere nulo sinaliza o final dos dados.

Agora, CF_UNICODETEXT mantém seus dados como UTF-16LE , portanto, mais do que provavelmente terá alguns bytes nulos , mas caracteres nulos (dois bytes nulos seguidos, basicamente) ainda terminarão a sequência.

Podemos apenas especular sobre por que caracteres nulos não são permitidos no texto da área de transferência, mas é mais provável que seja apenas porque as funções de processamento de string mais usadas no Windows assumem que um caractere nulo sinaliza o fim. A única outra maneira de saber onde uma string pára seria prefixá-la com seu comprimento.

Você pode reter gráficos na área de transferência, mesmo que eles provavelmente tenham bytes nulos, porque são distribuídos em diferentes formatos da área de transferência (por exemplo CF_BITMAP), que precisam ser entendidos de forma diferente pelos programas.

Ben N
fonte
Obrigado - ótima resposta. Definitivamente, aprendi algumas coisas boas sobre a área de transferência do Windows.
Senshin