Ngu*_*anh 84 windows notepad jpeg
这种现象一直让我有问题要问。
这是详细的实验,我的操作系统是 Windows 7 x64 SP1:
它应该看起来像这样,看起来很奇怪的文本序列,其中一些(非常罕见)实际上是有意义的,就像下面的截图“creator: dg-jpeg v1.0 ...”
当我尝试打开时,Windows 会说“Windows 照片查看器无法打开此图片,因为文件似乎已损坏、损坏或太大”。
我什至尝试使用另一种方法对其进行测试:用记事本打开 JPG,我从一个容易记住的位置(如第二行的第一个字符)剪切一个已知字符,然后保存文件。查看器当然会显示相同的消息。然后我再次打开它并将字符粘贴到确切位置(记事本会记住它的退出状态,如窗口位置、换行、字体大小......所以我没有问题)
而且还是同样的错误。你可以试试这个来获得想法,记得选择一张小图片,否则记事本会像一个生锈的老人。
造成这种现象的原因可能是什么?
man*_*per 82
根据用于打开文件的编码,您可能会看到不同的行为。我的 Windows 7 记事本允许以 ANSI、UTF-8、Unicode 或 Unicode big endian 打开文件。
我已经用 gimp 创建的小 2x2 像素 jpeg 图像测试了这个问题,并使用 ANSI 编码打开和保存图像文件。使用十六进制编辑器打开原始图像和保存的图像,我看到所有 00 序列(两个十六进制数字,NUL 控制字符)都已转换为 20(空格字符)。
在十六进制编辑器中将所有 20 x 00 替换回图像格式。
我用谷歌搜索了一下,我没有找到任何解释它为什么这样做的参考资料。只有对警告它的帖子的引用(谷歌缓存链接,页面不可用)。
如果您将文件保存/打开为 UTF-8,它似乎仍会将 NUL 字符转换为空格,但由于从单字节字符转换为 UTF-8 多字节序列,它也会增加生成的文件大小。
如果您将文件保存/打开为 Unicode,它似乎仍会将 NUL 字符转换为空格,但还会在文件开头添加一个字节,即BOM。
bha*_*era 39
记事本(ASCII code 32)
为NUL 等字符创建空格字符,(ASCII code 0)
因为 Windows API 的文本框只允许以空字符结尾的char *
ASCIIZ(字符数组、指针)。它在第一个 NUL 处被切断。
发生这种情况是因为Windows API主要是用C语言编写的,而空终止字符串是常见的功能之一。即使现代 Windows 和 Unicode 被认为是相同的空终止字符串也会发生。所以记事本只需用空格替换它们,这样您就可以查看完整的文件。
因此,当您保存文件时,它已损坏。
您可以使用类似beyond compare (commercial,trial) 之类的比较器来查看字符替换效果。另请参阅其他二进制比较工具。
注:(20) 16 = (32) 10
(我假设它仍然是用 C++ 编写的,或者至少使用一个类似的链接器)
我正在使用PEiD工具(它随着 PE+/64 exe 的引入而停止了开发)
PEiD 可以在Universal Extractor的 bin 文件夹中找到
我提取了记事本。ex_ 文件显然来自 Windows xp iso。试试看。这是使用 7z 的 cab 文件提取。
警告 !您的病毒扫描程序可能会将 Universal Extractor/PEiD 检测为黑客工具或病毒。不信不要下载!!
学分:杰森 C
这不仅仅是文本框;WM_SETTEXT通常不提供用于指定字符串长度的参数,并且始终假定字符串以空值终止。您始终可以使用指定字符串长度的自定义消息创建自定义文本框,但记事本和大多数其他程序合理地不会这样做。此外,函数SetWindowText也不提供长度参数。
Joh*_*hnC 28
记事本不会完全按原样保留所有特殊/扩展字符。我手头没有关于这种行为的参考,但我发现这是例如 UNIX 风格的行尾 LF 的情况,记事本将转换为 CRLF 和 null (0x00),它将忽略。在诸如 JPG 之类的二进制文件中,记事本不保留的字符可能会随机出现。用一个支持 HEX 的编辑器尝试你的实验,然后它应该可以工作。如果我找到了很好的参考资料,并且一旦我测试了 HEX 编辑器,我会更新我的答案。
更新:我尝试了一些著名的程序员编辑器,但其中只有一个立即生效,即 Maël Hörz 的 HxD。我以前从未使用过 HxD,但由于对这篇 Stack 文章的回答,Notepad++ 的十六进制查看器/编辑器插件找到了它。
其他经过几分钟努力后仍无法工作的编辑器是 Notepad++、Notepad2 和 UltraEdit(v17.3,旧版本)。其中一些在前几个字节的复制/粘贴方面存在问题,JPEG文件签名幻数FF D8 FF。也许他们会比我目前有时间更多地摆弄。
过去,您曾经可以使用 Write back 来做到这一点。它是 Windows 3.1 中的标准程序,但我不记得 Windows 95 是否包含它。写入将允许对其可以打开的任何文件进行二进制安全编辑(可能非常有限的文件大小)。记事本绝对不是二进制安全的(文本保持不变,但非文本字符的实际字节[例如控制代码] 可能会改变),这就是您的 JPG 示例不起作用的原因。尝试获取 Write 的副本(以及非常旧的 Windows)并再次尝试您的实验!
根据维基百科的“Windows Write”文章, Write 被包含到 Windows NT 3.5 中。从 Windows 95 开始,它被 Wordpad 取代。write.exe
仍然存在于 Windows 目录中,但只是用于打开写字板的包装器。
我认为这不是编码问题,也是字符集问题。JPG 格式基本上是一个字节流。因此允许不可打印的字符,如 NUL、ETX、STX、SOH、DLE 等。
Microsoft 记事本无法显示那些不可打印的字符。它可能会显示某种占位符,例如空字符的空格。因此,使用记事本打开文件不会显示实际内容,而是通过所选编码(utf-8、utf-16 等)解码并通过特定字符集(unicode、ascii 等)显示的内容,不包括非可打印字符。
选择所有显示的文本并将文本复制到剪贴板时,您只会复制包括占位符在内的可打印字符。因此自动将空字符转换为空格并完全忽略其他不可打印的字符。
所以基本上你只是失去了这样做的内容。如果您改用十六进制编辑器,它将完全复制所有内容。
更新:Bhathiya Pereras 的回答是正确的:https ://superuser.com/a/782885/322784 将文本复制到剪贴板时不会忽略不可打印的字符。
归档时间: |
|
查看次数: |
97781 次 |
最近记录: |