我正在编写 LZ77 压缩算法,并且无法将无符号字符存储在字符串中。为了压缩任何文件,我使用它的二进制表示,然后将其读取为chars
(因为 1 char 等于 1 字节,afaik)到std::string
. 一切都很好用chars
。但经过一段时间的谷歌搜索后,我了解到这char
并不总是 1 字节,所以我决定将它换成unsigned char
. 事情开始变得棘手:
- 压缩纯 .txt 时,一切都按预期工作,我在解压缩之前和之后得到相等的文件(我认为应该是这样,因为我们基本上在字节转换之前和之后处理文本)
- 但是,当尝试压缩 .bmp 时,与输入文件相比,解压缩文件会丢失 3 个字节(尝试将无符号字符保存到 std::string 时会丢失这 3 个字节)
所以,我的问题是——有没有办法将无符号字符正确保存到字符串中?
我尝试使用typedef basic_string<unsigned char> ustring
所有相关函数并将其交换为使用 with 的基本替代方法unsigned char
,但我仍然丢失了 3 个字节。
更新:我发现丢失 3 个字节(符号)不是因为 std::string,而是因为
std::istream_iterator
(我使用而不是std::istreambuf_iterator
)来创建无符号字符的字符串(因为std::istreambuf_iterator
的参数是 char,而不是无符号字符)
那么,有没有解决这个特定问题的方法?
例子:
std::vector<char> tempbuf(std::istreambuf_iterator<char>(file), {}); // reads 112782 symbols
std::vector<char> tempbuf(std::istream_iterator<char>(file), {}); // reads 112779 symbols
示例代码:
void LZ77::readFileUnpacked(std::string& path)
{
std::ifstream file(path, std::ios::in | std::ios::binary);
if (file.is_open())
{
// Works just fine with char, but loses 3 bytes with unsigned
std::string tempstring = std::string(std::istreambuf_iterator<char>(file), {});
file.close();
}
else
throw std::ios_base::failure("Failed to open the file");
}