从文件读取时更改字节顺序
Change the endianness when reading from a file
我试图更好地理解当有人读取文件时的字节顺序。
我使用的机器是小端。
下面的代码应该可以读取任何文件类型。
但是如果我们正在读取的文件是 UTF-16BE 编码,我们是否应该在读取整个文件后更改字节序?
我问这个是因为我计划编辑文件的内容并将其输出到控制台。
万一我们要改变字节序,怎么办?
现在我正在阅读这样的文件:
std::ifstream file("/RANDOME/PATH/file.html", std::ios::in | std::ios::binary);
std::string result;
file.seekg(0, std::ios::end);
result.reserve(t.tellg());
file.seekg(0, std::ios::beg);
result.assign((std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>());
file.close();
我不知道如何在读取文件时将字节顺序从大更改为小。有人可以一步一步地告诉我如何正确完成吗?
我只是想学习。我知道该文件使用的不是猜测的 UTF-16BE 编码。
这里有一些代码可以满足您的需求。请注意,此代码一次读取一行输入文件,而不是一次读取所有文件。
#include <string>
#include <fstream>
void swap_bytes (char16_t *s)
{
while (*s)
{
unsigned char *uc = (unsigned char *) s;
unsigned char swap = *uc;
*uc = uc [1];
uc [1] = swap;
++s;
}
}
int main ()
{
std::basic_ifstream <char16_t> file ("/RANDOME/PATH/file.html", std::ios::in);
if (!file)
return 1;
std::basic_string <char16_t> line;
while (std::getline (file, line))
{
swap_bytes (line.data ());
// ...
}
file.close();
}
如有不明之处请在评论中说明。
我试图更好地理解当有人读取文件时的字节顺序。
我使用的机器是小端。
下面的代码应该可以读取任何文件类型。
但是如果我们正在读取的文件是 UTF-16BE 编码,我们是否应该在读取整个文件后更改字节序?
我问这个是因为我计划编辑文件的内容并将其输出到控制台。
万一我们要改变字节序,怎么办?
现在我正在阅读这样的文件:
std::ifstream file("/RANDOME/PATH/file.html", std::ios::in | std::ios::binary);
std::string result;
file.seekg(0, std::ios::end);
result.reserve(t.tellg());
file.seekg(0, std::ios::beg);
result.assign((std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>());
file.close();
我不知道如何在读取文件时将字节顺序从大更改为小。有人可以一步一步地告诉我如何正确完成吗? 我只是想学习。我知道该文件使用的不是猜测的 UTF-16BE 编码。
这里有一些代码可以满足您的需求。请注意,此代码一次读取一行输入文件,而不是一次读取所有文件。
#include <string>
#include <fstream>
void swap_bytes (char16_t *s)
{
while (*s)
{
unsigned char *uc = (unsigned char *) s;
unsigned char swap = *uc;
*uc = uc [1];
uc [1] = swap;
++s;
}
}
int main ()
{
std::basic_ifstream <char16_t> file ("/RANDOME/PATH/file.html", std::ios::in);
if (!file)
return 1;
std::basic_string <char16_t> line;
while (std::getline (file, line))
{
swap_bytes (line.data ());
// ...
}
file.close();
}
如有不明之处请在评论中说明。