Есть ли способ скопировать нулевые байты (ASCII 0x00) в буфер обмена в Windows?

14

Нулевые байты (ASCII 0x00) не отображаются для копирования (Ctrl + C-способный) в Windows. Для демонстрации этого откройте консоль разработчика вашего браузера и сделайте console.log('a\x00b'). Если вы попытаетесь скопировать и вставить полученную строку на компьютере с Windows 8 (и, возможно, в других версиях Windows), вы обнаружите, что aкопируются только файлы. И \x00все после него игнорируется.

Есть ли способ скопировать всю строку, которая содержит нулевые байты? Может ли буфер обмена содержать нулевые байты?

(Вспомогательный вопрос: почему нельзя скопировать нулевые байты? Например, есть ли для этого причина, связанная с безопасностью, или это просто глупость Windows?)

senshin
источник
хороший вопрос .. интересно посмотреть, если он поместит его в буфер обмена, xxd может выводить нули C:\>echo 000000| xxd -r -p|xxd -p<ENTER> 000000 C:\>echo 000000| xxd -r -p|clip<ENTER> >
barlop
используя unxutils gclip и pclip C:\>echo 000000| xxd -r -p|gclip<ENTER> C:\>pclip|xxd -p<ENTER> C:\>pclip>a.a<ENTER> <- мне не ясно, входят ли нули в буфер обмена ... или они есть, но не вставляются.
Барлоп
2
Где-то в цепочке программа использует строковые функции / представления с нулевым символом в конце (т.е. строковые функции Си). Очень распространенный. Мое скудное понимание таких вещей - «да», есть потенциальные проблемы безопасности с встраиванием нулей, в основном из-за возможности неправильной идентификации длины строки и переполнения буфера (??).
Йорик
Это загадка: я скопировал содержимое JPG в буфер обмена, и когда я прочитал его обратно, оно было усечено до первого нуля, что говорит о том, что буфер обмена основан на тексте. Тем не менее, я могу без проблем создавать дамп или вырезать и вставлять изображения между графическими пакетами.
AFH
Я думаю, это зависит от используемого формата. Буфер обмена поддерживает разные форматы. Если вы копируете текст, они, скорее всего, не поддерживаются нулевыми символами, потому что они используются в качестве ограничителя строки. Если вы используете двоичный формат буфера обмена, вы можете скопировать и вставить нулевые байты.
Алексей Иванов

Ответы:

10

Нет, вы не можете поместить текст со встроенными нулевыми символами в буфер обмена. Давайте посмотрим на список стандартных форматов буфера обмена Windows . Есть несколько форматов, которые содержат вещи, обычно понимаемые как текст:

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

Каждый из них имеет это предложение в своем определении:

Нулевой символ указывает на конец данных.

Теперь CF_UNICODETEXT хранит свои данные как UTF-16LE , поэтому он, скорее всего, будет иметь нулевые байты , но нулевые символы (в основном два нулевых байта в строке) по-прежнему будут заканчивать строку.

Мы можем только догадываться о том, почему нулевые символы не допускаются в тексте буфера обмена, но, скорее всего, это происходит только потому, что наиболее часто используемые в Windows функции обработки строк предполагают, что нулевой символ сигнализирует о конце. Единственный другой способ узнать, где заканчивается строка - это поставить перед ней префикс.

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

Бен Н
источник
Спасибо - отличный ответ. Я определенно узнал кое-что хорошее о буфере обмена Windows.
Senshin