【问题标题】:Endianess in reading/writing files C读/写文件的字节顺序 C
【发布时间】:2021-03-12 11:05:07
【问题描述】:

我需要将一个文件二进制文件复制到另一个 C 中。所有文件都是 UTF-16。

我会从用户那里收到源(要读取的)文件是 unix、mac 还是 windows。

另外,我将从用户那里收到目标文件(要写入)是 unix、mac 还是 windows。

复制每个字节时应该注意什么?

我有一个缓冲区unsigned char buffer[2];,我像这样复制每个字节:

while (fread(buffer,sizeof(buffer),1,source) != 0) {
        fwrite(buffer,sizeof(buffer),1,target);
}

现在我只关注“线路断路器”。例如(从 unix 到 mac),我这样做:

if (buffer[0] == 0x000a) {
            buffer[0] = 0x000d;
}
if (buffer[1] == 0x000a) {
            buffer[1] = 0x000d;
}

试图从\n 更改为\r

** 我可以假设每个文件的开头都会有一个 BOM。

在进行此转换时,我还有什么需要注意的吗?我应该在第一个 BOM 字符中更改某些内容吗?我应该使用该程序根据计算机的字节序检查字节顺序吗?还有其他可能出错的地方吗?

谢谢

【问题讨论】:

  • 所以您正在逐字节处理未知字节序的 UTF-16 并处理您遇到的所有 0d 或 0a 字节?你知道这些字节也会出现在其他 unicode 字符中,对吧?
  • UTF-16 编码文件有(至少)三种类型:带有 BOM 的 UTF-16 和可能的字节序,UTF-16LE 总是小端,没有 BOM,以及 UTF-16BE 总是大端没有 BOM。如果使用后两者,您需要通过某种方式知道正在使用哪一个,因为您无法检查 BOM。被告知平台表明您可能需要进行行尾转换,因此您必须知道哪个在起作用。
  • 您可能应该解析 BOM 并根据它在大和小之间调整您的处理。即使您只想处理换行符。
  • 您可能会通过检查 0a/0d + 另一个字节为零而侥幸逃脱。 0a00 什么都不是,0d00 是马拉雅拉姆语,如果你不使用它,那应该是安全的。
  • 我可以假设 BOM 将出现在每个文件中。然后我应该根据程序运行的计算机更改目标文件中的 BOM 吗?我是否也应该根据字节序检查 0x000a 或 0xa000 吗?根据字节序进行复制时是否应该反转每个位?

标签: c file binary operating-system low-level


【解决方案1】:

在进行这种过渡时,我还有什么需要注意的吗?

OP 假设操作系统规定文件 endidan 和行尾。

操作系统有倾向使用特定的字节序和行尾,但此工具不应盲目地遵循这一点,而是在未提供其他覆盖信息时使用操作系统相关的默认值。 p>

允许这种能力将有助于测试。


当输入文件本身有BOM时,字节序不是由操作系统决定的,而是由BOM决定的。当 BOM 丢失或未知时,现在只需退出或可能假定操作系统默认字节序。

可以通过调查确定输入的行尾(LF、CR、CRLF),可能就像查找第一个行尾一样简单。

输出端应遵循程序选项,例如“big”、“little”、“same as input”、“Mac”、“Unix”、“Windows”。如果该选项缺失或“默认”,则使用每个操作系统的默认字节序。

输出行尾应遵循程序选项,例如“LF”、“CRLF”、“CR”、“与输入相同”。如果该选项缺失或“默认”,则使用每个操作系统的默认文件结尾。

鉴于这些选项,文件可能需要以二进制模式打开。如果在“默认”模式下工作,代码可以在 UTF16 文本模式下独立打开输入和/或输出,并使用宽函数并让库处理 endian/end-of-line。


其他想法:

应对没有输入 BOM。

无需 BOM 即可编写。

允许最后一个 ^Z 作为非字符。

添加一个^Z

检测无效的 UTF-16 序列:奇数字节,无效代理对。


IIRC,“Mac”行尾取决于其操作系统版本。


总结:创建一个通用阅读器,计算输入并形成可配置的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2021-07-16
    • 2011-01-27
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多