将字符串转换为uint8_t数组

3

我有一个大小为32字节的字符串(key_str),我想将每个字节存储在uint8_t类型数组key[32]中。

我尝试了以下方法:

string key_str = "00001000200030004000500060007000";
uint32_t key[32] ;
uint8_t* k = reinterpret_cast <uint8_t*>(&key_str[0]);

for(int j = 0; j < 32; j++)
   {
    key[j]= *k;
    k++;
    cout<<bitset<8>(key[j])<<endl;
   }

但输出的最高有效位(MSB)始终为0011,这是由于字符(0、1、...)的表示方式导致的。那么我该如何将其转换为整数?

输出示例: 00110000 .. 00110001 .. 00110010 ..


你能保证字符串输入至少有32个字节吗(在给定的示例中,当然可以,但在实际代码中呢)?如果不能,请务必添加长度检查或仅迭代到std::min(key_str.length(), 32)。不要使用字面量32,最好使用sizeof(key)/sizeof(*key),这样您可以更改数组大小而不必担心忘记调整其他地方。如果您使用std::array而不是原始数组,则可以使用其size()成员而不是丑陋但必要的按第一个元素大小除法(请注意,sizeof始终以字节为单位给出大小!) - Aconcagua
1个回答

3
你的代码还需要一些其他的工作,但是如果我理解正确的话,Bug 是因为你没有弥补 ASCII 字符值 '0' 的偏移量。
尝试使用以下代码(尽可能接近您的代码):
#include <string>
#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    string key_str = "00001000200030004000500060007000";
    uint8_t key[32] ;

    for (int j = 0; j < 32; j++)
    {
        key[j] =  static_cast<uint8_t>(key_str[j] - '0');
        cout << bitset<8>(key[j]) << endl;
    }

    return 0;
}

输出:

00000000
00000000
00000000
00000000
00000001
00000000
00000000
00000010
...

所以,关于你的问题,关键在于这里减去了'0'key[j] = static_cast<uint8_t>(key_str[j] - '0');
另外,如果你说:

我想将每个字节存储在uint8_t数组元素key [32]

那么也许你错误地将其定义为uint32_t key [32];而不是uint8_t key [];。 我已经纠正了它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接