繁体   English   中英

如何只给二进制文件中的任何整数分配16位,而不是C ++中的普通32位?

[英]How to assign only 16 bits to any integer in a binary file instead of the normal 32 in C++?

我有一个程序可以使用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 ++标准的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM