c++ - 如何仅将 16 位分配给二进制文件中的任何整数而不是 C++ 中的正常 32 位?

标签 c++ binaryfiles lzw

我有一个程序可以使用 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/

相关文章:

c++ - 虚拟多重继承

git - 是否有应用 .gitattributes 的全局方法?

CSAPP 实验室 datalab dlc 无法在 mac osx Yosemite 中运行

c# - 通过解码 "*.itemdata-ms"二进制数据文件自定义Windows 8.1 StartScreen (Windows 8.1, StartScreen, C#)

algorithm - LZW-解压缩算法

c++ - C 或 C++ 是否保证 array < array + SIZE?

c++ - 如何使窗口出现在所有内容之上(甚至是全屏游戏!)c++/Qt

c++ - 在qt中不同类的ui标签上写

c - LZW 压缩

c - GIF LZW 压缩流中的编码错误