有什么方法可以在Windows上将空字节(ASCII 0x00)复制到剪贴板吗?


14

在Windows上,空字节(ASCII 0x00)似乎不可复制(Ctrl + C-able)。为了演示这一点,请打开浏览器的开发控制台并执行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> >
barlop

使用unxutils gclip和pclip C:\>echo 000000| xxd -r -p|gclip<ENTER> C:\>pclip|xxd -p<ENTER> C:\>pclip>a.a<ENTER> <-不清楚空值是否进入剪贴板..或它们是否在其中但没有粘贴。
barlop

2
在链中的某个位置,程序正在使用以空值终止的字符串函数/表示形式(即C字符串函数)。很普通的。我对这些事情的了解很微弱,是“是”,存在嵌入空值的潜在安全问题,这主要是由于可能会错误地识别字符串长度和缓冲区溢出(??)。
约里克(Yorik)

令人困惑:我将JPG的内容复制到剪贴板,当我读回它时,它在第一个空值处被截断,这表明剪贴板是基于文本的。但是我可以在图形包之间进行屏幕转储或剪切和粘贴图像而不会出现问题。
AFH 2015年

我想这取决于所使用的格式。剪贴板支持不同的格式。如果您复制文本,则很可能不支持使用空字符,因为它们被用作字符串终止符。如果使用二进制剪贴板格式,则可以复制和粘贴空字节。
Alexey Ivanov

Answers:


10

不可以,您不能在剪贴板上放置带有嵌入式空字符的文本。让我们看一下标准Windows剪贴板格式的列表。有几种格式可以容纳通常理解为文本的内容:

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

其中的每一个在其定义中都有这句话:

空字符表示数据结束。

现在,CF_UNICODETEXT 将其数据保留为UTF-16LE,因此很有可能会有一些空字节,但是空字符(基本上是连续两个空字节)仍将以字符串结尾。

我们只能推测为什么剪贴板文本中不允许使用空字符,但是很有可能只是因为Windows中最常用的字符串处理函数假定空字符表示结束。知道字符串在哪里停止的唯一其他方法是为其长度加上前缀。

即使图形可能具有空字节,您也可以将其保留在剪贴板上,因为它们以不同的剪贴板格式(例如CF_BITMAP)传递,程序必须用不同的方式来理解它们。


谢谢-很好的答案。我肯定从Windows剪贴板中学到了一些好东西。
senshin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.