【发布时间】:2020-03-19 21:01:29
【问题描述】:
我正在实现一个 LZW 压缩/解压缩实用程序库,并且需要以我正在使用的方式返回压缩输出:
using ByteSequence = std::vector<std::uint8_t>
压缩器的输出格式将包括算法找到的各种序列在压缩器字典中的位置。例如,输出中的 16 位位置如下所示:
std::vector<std::uint16_t> pos{123, 385, /* ... */};
但是,输出必须是ByteSequence,并且需要在架构之间移植。我目前将pos 向量转换为所需格式的操作是:
for (auto p : pos)
{
std::uint8_t *bytes = (std::uint8_t *) &p;
output.push_back(bytes[0]);
output.push_back(bytes[1]);
}
这可行,但前提是每个密钥都是 16 位的,老实说,这对我来说似乎是一个廉价的把戏。
我应该如何以更好、更清洁的方式做到这一点?谢谢!
【问题讨论】:
-
“需要在架构之间移植” - 不是通过代码做的事情,它不是。在 best 时,这将根据编码器上存在的字节序发出不同的字节流。使用移位和掩码将每个八位组从
uint16_t中拉出;先高后低,并确保您的解码器知道该决定。 -
@WhozCraig 我明白你的意思,我也是这么想的。但是,对于大于 2 个字节的键,我还应该以相同的方式提取字节吗?
-
和你这里展示的一样吗?还是像我描述的那样逐字节自上而下?对前者不,对后者?