如何将int的向量转换为2位十六进制并按顺序添加到c字符串? [重复]

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

这个问题在这里已有答案:

我想接受一个uint8_t vector函数,然后将每个元素转换为一个2位数(所有未使用的数字都是0)写入存储在字符串中的十六进制数。我想我可能会在这里感到困惑......

我想办法用printf(我认为):

std::vector<uint8_t> name1 = { 's', '2', '9', '2', 'a', 'b' };

    for (int i = 0; i < name1.size(); i++) {
        printf("printf: %002X ", name1[i]);
        std::cout << std::endl;
    }

但接下来的想法是我创建一个字符串,如:

MSGPACK 733239326162

其中73是s,32显然是2等...

所以我想把上面的MSGPACK ... 162放到一个存储它的变量中,然后再做像printf(msgpack1)这样的事情。

我尝试了以下方式......

char buffer[40];

std::vector<uint8_t> name1 = { 's', '2', '9', '2', 'a', 'b' };

for (int i = 0; i < name1.size(); i++) {
    snprintf(buffer, sizeof(buffer), "%002X", name1[i]);
}

buffer[name1.size()] = '\0';

所以我希望我可以像这样打印出来:

printf("MSGPACK %s", buffer);

我不确定我在这里做错了什么,但我得到的是MSGPACK 62作为输出。如何得到我需要的东西?

编辑:我看到缓冲区现在被向量的最后一个成员覆盖了,但是我不能只将buffer[i]放到snprintf中,那么它的方法是什么呢?

c++ mbed
1个回答
1
投票
std::vector<uint8_t> name1 = { 's', '2', '9', '2', 'a', 'b' };
int buffsize = name1.size()*2+1;
char buffer[buffsize];
int retvalue = 0;

for (int i = 0; i < name1.size()*2 && retvalue >= 0 && retvalue < buffsize; i++) {
        retvalue = snprintf(buffer+2*i, sizeof(buffer)-2*i, "%002X", name1[i]);
}

buffer[buffsize-1] = '\0';

printf("MSGPACK %s", buffer);

输出:

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