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 中。一切似乎都很好:
- *ini 文件有字节顺序标记 (0xFFFE),
- 调查内存(调试)给了我相同的结果 - endianess 变量存储 0xFFFE。
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);
我……很困惑。 事情是这样的。我有一个编码为 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 中。一切似乎都很好:
- *ini 文件有字节顺序标记 (0xFFFE),
- 调查内存(调试)给了我相同的结果 - endianess 变量存储 0xFFFE。
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);