如何从 C++ 中的 8 位 (uint8_t) 数组获取 11 位表示

问题描述 投票:0回答:1

我正在尝试在我的项目中实施**BIP39 **标准。其他一切都很好,但我被严重卡住了,我已经在谷歌和 ChatGPT 中进行了最深入的搜索,但没有找到解决方案。

我有向量 存储 33 个字节的熵和校验和。

vector <uint8_t> ent_cs; //have already put 256 bits (32 bytes) of entropy and 8 bits (1 byte) checksum

我正在尝试将此数组读取为

vector <uint16_t>
中的 11 位表示(0 - 2,047),因此我可以为每个数字分配一个助记词,该数字将用作生成私钥的种子。

此外,C++ 没有原生的 11 位整数数据类型

谢谢

我期望存储在 uint16_t 数组/向量中的 0 到 2047 之间的 24 个 11 位数字

c++ data-structures hash cryptography private-key
1个回答
0
投票

这里是一些简单的代码,它是为了便于理解而不是最终效率而设计的

// 33 bytes is 24 11-bit numbers
for (size_t i = 0; i < 24; ++i)
{
    size_t offset = 11*i;
    size_t byte_offset = offset/8;
    unsigned bit_offset = offset%8;
    unsigned number = 0;
    size_t bits_copied = 0;
    if (bit_offset != 0)
    {
        // extract high bits from the first byte
        number += ent_cs[byte_offset] >> bit_offset;
        bits_copied += 8 - bit_offset;
        ++byte_offset;
        bit_offset = 0;
    }
    while (bits_copied < 11)
    {
        // extract whole byte
        number += ent_cs[byte_offset] << bits_copied;
        bits_copied += 8;
        ++byte_offset;
    }
    // remove any overflow (since bits_copied maybe greater than 11)
    number &= (1 << 11) - 1;
    std::cout << number << '\n';
}

似乎在工作。我做了一些假设,特别是向量中的低位和字节是 11 位数字中的低位。

© www.soinside.com 2019 - 2024. All rights reserved.