Czy jest jakiś sposób, aby skopiować puste bajty (ASCII 0x00) do schowka w systemie Windows?

14

Puste bajty (ASCII 0x00) nie wydają się być kopiowalne (Ctrl + C-zdolne) w systemie Windows. Aby to zademonstrować, otwórz konsolę programistyczną przeglądarki i zrób to console.log('a\x00b'). Jeśli spróbujesz skopiować i wkleić wynikowy ciąg na komputerze z systemem Windows 8 (i prawdopodobnie także w innych wersjach systemu Windows), przekonasz się, że tylko apliki zostaną skopiowane. \x00A wszystko po to jest ignorowany.

Czy istnieje sposób na skopiowanie całego łańcucha zawierającego bajty zerowe? Czy schowek może pomieścić nawet bajty zerowe?

(Pytanie pomocnicze: dlaczego nie można skopiować bajtów zerowych? Np. Czy jest to uzasadniony względami bezpieczeństwa, czy tylko Windows jest głupi?)

senshin
źródło
dobre pytanie .. bądź ciekawy, czy to umieszcza go w schowku xxd może wyświetlać wartości null C:\>echo 000000| xxd -r -p|xxd -p<ENTER> 000000 C:\>echo 000000| xxd -r -p|clip<ENTER> >
barlop
używając unxutils gclip i pclip C:\>echo 000000| xxd -r -p|gclip<ENTER> C:\>pclip|xxd -p<ENTER> C:\>pclip>a.a<ENTER> <- nie jest dla mnie jasne, czy wartości null idą do schowka .. czy też są, ale nie wklejają się.
barlop
2
Gdzieś w łańcuchu program używa zakończonych znakiem zerowym funkcji / reprezentacji ciągów (tj. Funkcji ciągów C). Bardzo częste. Moje skromne rozumienie takich rzeczy brzmi „tak”. Możliwe są problemy z bezpieczeństwem związane z osadzaniem wartości zerowych, głównie ze względu na możliwość błędnej identyfikacji długości łańcucha i przepełnienia bufora (??).
Yorik
To łamigłówka: Skopiowałem zawartość pliku JPG do schowka, a kiedy go ponownie przeczytałem, został obcięty przy pierwszym null, co sugeruje, że schowek jest oparty na tekście. Mogę jednak bez problemu wyświetlać zrzuty lub wycinać i wklejać obrazy między pakietami graficznymi.
AFH
Myślę, że to zależy od używanego formatu. Schowek obsługuje różne formaty. Jeśli skopiujesz tekst, najprawdopodobniej nie są obsługiwane znaki puste, ponieważ są one używane jako terminator ciągów. Jeśli używasz binarnego formatu schowka, możesz skopiować i wkleić bajty zerowe.
Aleksiej Iwanow

Odpowiedzi:

10

Nie, nie można umieszczać tekstu ze osadzonymi znakami null w schowku. Spójrzmy na listę standardowych formatów schowka Windows . Istnieje kilka formatów, które przechowują rzeczy ogólnie rozumiane jako tekst:

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

Każdy z nich ma w swojej definicji to zdanie:

Znak null oznacza koniec danych.

Teraz CF_UNICODETEXT zachowuje swoje dane jako UTF-16LE , więc bardziej niż prawdopodobne będzie, że będzie miał puste bajty , ale znaki puste (w zasadzie dwa bajty puste w rzędzie) nadal kończą łańcuch.

Możemy jedynie spekulować, dlaczego znaki puste są niedozwolone w tekście schowka, ale bardziej niż prawdopodobne jest to tylko dlatego, że najczęściej używane funkcje przetwarzania ciągów w systemie Windows zakładają, że znak null sygnalizuje koniec. Jedynym innym sposobem, aby dowiedzieć się, gdzie łańcuch się zatrzymuje, jest poprzedzenie go długością.

Możesz przechowywać grafikę w schowku, mimo że prawdopodobnie mają puste bajty, ponieważ są one przekazywane w różnych formatach schowka (np. CF_BITMAP), Które muszą być różnie rozumiane przez programy.

Ben N.
źródło
Dzięki - świetna odpowiedź. Zdecydowanie nauczyłem się kilku dobrych rzeczy o schowku Windows.
senshin 29.04.16