C程序反向读取BOM(往左走……不对!另一个往左走)

C program reads BOM in reverse (Go left... No! The other left)

我……很困惑。 事情是这样的。我有一个编码为 UNICODE (Little Endian) 的 *ini 文件。 在我的 Visual Studio 项目(我自己的 ini 解析器)中,我正在检查文本文件是否在文件开头有 BOM(字节顺序标记)。

来自维基百科:

11111111 11111110 (0xFFFE) - 小端 BOM,

11111110 11111111 (0xFEFF) - 大端 BOM。

到目前为止,我是对的,对吧?

现在是编写小代码的时候了:

size_t temp_val = 0;
wchar_t * endianness_val = new wchar_t;
temp_val = fread_s(endianness_val, sizeof(wchar_t), sizeof(wchar_t), 1, fp);

    if (*endianness_val == (wchar_t)0xFFFE)
    {
        endianness = 1;
        wprintf(L"\n UNICODE(16bit): Little Endian!");
    }
    else if (*endianness_val == (wchar_t)0xFEFF)
    {
        endianness = -1; //big endian
        wprintf(L"\n UNICODE(16bit): Big Endian!");
    }
    else
    {
        endianness = 0; //no BOM, little endian default
        wprintf(L"\n No BOM. Narrow characters (8bit) Assuming Little Endian!");
    }

我首先从文件中读取(使用 fread_s)wchar_t,然后将其存储在 endianness_val 中。一切似乎都很好:

Aaaannd Visual Studio 不断进入 Big Endian 的 if 语句(像个疯子 ;))。当然,为 Big Endian 更改 BOM 会导致 Visual Studio 输入正确的 if 语句。知道为什么这会倒退吗?

谢谢。

fp 中打开的文本文件中尝试 运行 以下代码,看看它是否能帮助您捕获 概念性 错误:

uint8_t bytes[2];
uint16_t word;

fread(bytes, 1, 2, fp);
fseek(fp, 0, SEEK_SET);
fread(&word, 2, 1, fp);
fclose(fp);

wprintf(L"%.2hhX %.2hhX\n", bytes[0], bytes[1]);
wprintf(L"%.4hX\n", word);