我有一个程序可以使用 LZW 算法和哈希表来创建压缩文件。我的压缩文件当前包含与哈希表索引对应的整数。 这个压缩文件中的最大整数约为 46000,可以很容易地用 16 位来表示。 现在,当我使用以下代码将此“compressedfile.txt”转换为二进制文件“binary.bin”(以进一步减小文件大小)时,我在“binary.bin”文件中得到了 32 位整数。例如。如果我的压缩文件中有数字 84,它会在我的二进制文件中转换为 5400 0000。
std::ifstream in("compressedfile.txt");
std::ofstream out("binary.bin", ios::out | std::ios::binary);
int d;
while(in >> d)
{out.write((char*)&d, 4);}
我的问题是,我不能丢弃“5400 0000”中的结尾“0000”,这会在我的文件中占用额外的 2 个字节。每个整数都是这种情况,因为我的最大整数是 46000,只能使用 2 个字节来表示。是否有任何代码可以这样设置我的二进制文件的基础?我希望我的问题很清楚。
最佳答案
它正按照您的指示写入,d 地址处的 4 个字节(一个整数,在许多平台上为 32 位)。使用 16 位类型并改为写入 2 个字节:
uint16_t d; // unsigned to ensure it's large enough to hold your max value of 46000
while (in >> d) out.write(reinterpret_cast<char*>(&d), sizeof d);
编辑:正如评论中所指出的,要使此代码及其生成的数据可跨处理器架构移植,您应该为输出选择字节顺序约定。我建议使用 htons()将您的 uint16_t 转换为广泛可用的网络字节顺序,尽管(还)不是 C++ 标准的一部分。
关于c++ - 如何仅将 16 位分配给二进制文件中的任何整数而不是 C++ 中的正常 32 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19638125/