png 中 CRLF CR 块的值
Value of CRLF CR chunk in png
在我从该网站获得的 Desiginin File Formats link 中,我注意到 png 有 CRLF\x1A\LF
块,用于 "testing" 马车 return 和换行符转换。
我正在为某个项目构建自定义二进制结构,我想知道为什么这很有用,在什么情况下我应该考虑添加它?
历史原因,不同的 OSes 使用不同的序列来标记文本文件中的行结尾:
- Unix 和同伴
\n
(换行)
- DOS 和 Windows
\r\n
(carriage-return,换行)
- MacOS(前MacOSX)
\r
(carriage-return)(MacOS X(它有一个 BSD Unix 内核)可能同时支持:A Line Break Is a Line Break).
这都是一团糟,例如:
- 有时 Windows 文本文件在 Xemacs 中看起来有点奇怪,所有行都在行尾用
^M
装饰。
- Windows 记事本(附带的纯文本编辑器)仅在一行中显示 Linux 个文本文件。
曾经,您定期在不同的 OS 之间切换,您开始习惯 line-endings 必须不时修复。有许多帮助工具,例如cygwin中的unix2dos
和dos2unix
,Notepad++中的特殊命令,VisualStudio中的提示等
在 C 中,即使在 DOS 和 Windows 中,line-ending 总是被 \n
注释。 (我没有 Mac OS 的经验,但我想知道它是否不一样。)为了使这个工作无缝,MS 决定 "fix" 读写文件内容"under the hood"。读取文件时,所有出现的 \r\n
都会被 \n
静默替换,而文件写入会在每个写入的 \n
.
之前插入一个 \r
这有一些恼人的缺点:
如果读取一定大小的文件,"received"内容可能会小一些字节。 (我曾经在尝试保留 space 之前的文件加载并一次读取全部内容时偶然发现了这一点。我想知道为什么加载后某些字节似乎丢失了。)
这可能会中断二进制文件的加载,其中 \n
仅表示二进制值 10 具有任何含义(超出换行符)。
为了解决这个问题,C API 为文件 I/O 提供了额外的模式。例如。 fopen()
支持 r
、w
和 a
之外的额外字符来指示文件类型
b
表示二进制I/O(不要触摸内容)
t
表示文本I/O(修复line-endings)。
没有其中任何一个,默认为文本I/O。
在 Windows 以及便携式文件 I/O 上,应始终提供此信息。 (在 Linux 上,它根本没有任何效果,尤其是没有损坏。)
我曾经写过一个 的答案,其中一个损坏的 BMP 文件的转储很好地说明了错误完成的文件输出的影响。
在这个关于文本和二进制文件的长篇故事之后 I/O,很明显,对于处理图像数据(通常是二进制编码)的开发人员来说,这始终是一个潜在的问题。
因此,我可以想象 \r\n2\n
序列只是一个测试模式。如果这 4 个字节不完全具有这些值,那么
的可能性很大
- 文件以错误模式打开(在相关平台上)或
- 以前的工具损坏了文件的内容。
It will allow the decoder to throw useful error messages in that case as opposed to failing mysteriously.
在我从该网站获得的 Desiginin File Formats link 中,我注意到 png 有 CRLF\x1A\LF
块,用于 "testing" 马车 return 和换行符转换。
我正在为某个项目构建自定义二进制结构,我想知道为什么这很有用,在什么情况下我应该考虑添加它?
历史原因,不同的 OSes 使用不同的序列来标记文本文件中的行结尾:
- Unix 和同伴
\n
(换行) - DOS 和 Windows
\r\n
(carriage-return,换行) - MacOS(前MacOSX)
\r
(carriage-return)(MacOS X(它有一个 BSD Unix 内核)可能同时支持:A Line Break Is a Line Break).
这都是一团糟,例如:
- 有时 Windows 文本文件在 Xemacs 中看起来有点奇怪,所有行都在行尾用
^M
装饰。 - Windows 记事本(附带的纯文本编辑器)仅在一行中显示 Linux 个文本文件。
曾经,您定期在不同的 OS 之间切换,您开始习惯 line-endings 必须不时修复。有许多帮助工具,例如cygwin中的unix2dos
和dos2unix
,Notepad++中的特殊命令,VisualStudio中的提示等
在 C 中,即使在 DOS 和 Windows 中,line-ending 总是被 \n
注释。 (我没有 Mac OS 的经验,但我想知道它是否不一样。)为了使这个工作无缝,MS 决定 "fix" 读写文件内容"under the hood"。读取文件时,所有出现的 \r\n
都会被 \n
静默替换,而文件写入会在每个写入的 \n
.
\r
这有一些恼人的缺点:
如果读取一定大小的文件,"received"内容可能会小一些字节。 (我曾经在尝试保留 space 之前的文件加载并一次读取全部内容时偶然发现了这一点。我想知道为什么加载后某些字节似乎丢失了。)
这可能会中断二进制文件的加载,其中
\n
仅表示二进制值 10 具有任何含义(超出换行符)。
为了解决这个问题,C API 为文件 I/O 提供了额外的模式。例如。 fopen()
支持 r
、w
和 a
之外的额外字符来指示文件类型
b
表示二进制I/O(不要触摸内容)t
表示文本I/O(修复line-endings)。
没有其中任何一个,默认为文本I/O。
在 Windows 以及便携式文件 I/O 上,应始终提供此信息。 (在 Linux 上,它根本没有任何效果,尤其是没有损坏。)
我曾经写过一个
在这个关于文本和二进制文件的长篇故事之后 I/O,很明显,对于处理图像数据(通常是二进制编码)的开发人员来说,这始终是一个潜在的问题。
因此,我可以想象 \r\n2\n
序列只是一个测试模式。如果这 4 个字节不完全具有这些值,那么
- 文件以错误模式打开(在相关平台上)或
- 以前的工具损坏了文件的内容。
It will allow the decoder to throw useful error messages in that case as opposed to failing mysteriously.