Чи є якийсь спосіб скопіювати нульові байти (ASCII 0x00) у буфер обміну в Windows?


14

Нулі байти (ASCII 0x00) не здаються копіюваними (Ctrl + C)) у Windows. Щоб продемонструвати це, відкрийте консоль розробника свого браузера та зробіть це console.log('a\x00b'). Якщо ви спробуєте скопіювати отриманий рядок на машину Windows 8 (і, ймовірно, і інші версії Windows), ви побачите, що aкопіюється лише отримане . \x00І все після нього ігнорується.

Чи є якийсь спосіб скопіювати цілість рядка, що містить нульові байти? Чи може буфер обміну вмістити навіть нульові байти?

(Допоміжний запитання: чому не можна скопіювати нульові байти? Наприклад, чи є причина, пов’язана з безпекою, чи це просто Windows, що нерозумно?)


гарне запитання .. Будьте цікаві, якщо він може ввести в буфер обміну xxd може вивести нулі C:\>echo 000000| xxd -r -p|xxd -p<ENTER> 000000 C:\>echo 000000| xxd -r -p|clip<ENTER> >
барлоп

використовуючи unxutils gclip та pclip C:\>echo 000000| xxd -r -p|gclip<ENTER> C:\>pclip|xxd -p<ENTER> C:\>pclip>a.a<ENTER> <- мені незрозуміло, чи нули збираються у буфер обміну .. чи вони входять, але не вставляються.
барлоп

2
Десь у ланцюзі програма використовує нульові завершені рядкові функції / представлення (тобто функції рядка C). Дуже часто. Моє мізерне розуміння таких речей - «так», можливі проблеми із безпекою із вбудовуванням нулів, здебільшого через потенційність неправильної ідентифікації довжини рядка та переповнення буфера (??).
Йорік

Це загадка: я скопіював вміст JPG у буфер обміну, і коли я прочитав його, він був усічений у перший нуль, що дозволяє припустити, що буфер обміну є текстовим. Тим не менш, я можу екранувати скидання або вирізання та вставлення зображень між графічними пакетами без проблем.
AFH

Я думаю, це залежить від використовуваного формату. Буфер обміну підтримує різні формати. Якщо ви копіюєте текст, вони, швидше за все, нульові символи не підтримуються, оскільки вони використовуються як термінатор рядків. Якщо ви використовуєте двійковий формат буфера обміну, ви можете скопіювати та вставити нульові байти.
Олексій Іванов

Відповіді:


10

Ні, ви не можете розмістити текст із вбудованими нульовими символами у буфер обміну. Давайте розглянемо список стандартних форматів буфера обміну для Windows . Існує кілька форматів, які містять речі, як правило, розуміються як текст:

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

Кожен з них має у своєму визначенні це речення:

Нульовий символ сигналізує про кінець даних.

Тепер він CF_UNICODETEXT зберігає свої дані як UTF-16LE , тому він, швидше за все, матиме кілька нульових байтів , але нульові символи (в основному два нульові байти), як і раніше, закінчують рядок.

Ми можемо лише розмірковувати про те, чому нульові символи не дозволені в тексті буфера обміну, але більш ніж ймовірно, це лише тому, що найчастіше використовувані функції обробки рядків у Windows передбачають, що нульовий символ сигналізує про закінчення. Єдиний інший спосіб дізнатись, де зупиняється рядок, - це префікс її довжини.

Ви можете зберігати графіку в буфері обміну, навіть якщо вони, ймовірно, мають нульові байти, оскільки вони передаються в різних форматах буфера обміну (наприклад CF_BITMAP), які програми повинні розуміти по-різному.


Спасибі - чудова відповідь. Я, безумовно, дізнався кілька хороших речей про буфер обміну Windows.
сеншин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.