繁体   English   中英

将向量无符号字符转换为字符串/整数

[英]Convert vector unsigned char to string/int

我确实尝试搜索方法,但没有找到最佳方法。 我正在使用Cubia Firebase服务器开发游戏,并使用套接字进行连接。 以下是从服务器收到的数据包:

--TableSnapshotPacket
 |--int32_t tableid;
 |--std::string address;
 |--std::string name;
 |--int16_t capacity;
 |--int16_t seated;
 |--std::vector<Param> params;
                 |--std::string key;
                 |--int8_t type;
                 |--vector<uint8_t> value;

我的问题是参数的解析器键值到字符串和整数。 我想为字符串http://i.stack.imgur.com/xlv9y.pngkey == 'N'

并为int设置key == 'M' M'http://i.stack.imgur.com/Kjynp.png

如您所见, vector<uint8_8> value包含'\\ 0',所以我在解析器上遇到问题。 下面是我的方法,可以转换为字符串,但是我感觉不好,并且不能转换为int。

for (int i = 0; i < ip->value.size(); i++)
{
    if (i < 2)
        value.push_back(' ');
    else
        value.push_back(ip->value[i]);

    printf("%d", ip->value[i]);
}

有谁最理想? 这是Java中的代码: http://i.stack.imgur.com/hDn9b.png : http://i.stack.imgur.com/hDn9b.png

根据图片,情况是:

-intvalue向量包含4个具有int值的元素(可以为正序或反向)。 您可以读取int,首先检查大小是否等于4,然后将向量指针强制转换为int32_t(对于前进顺序)。 例:

if (ip->value.size() != sizeof(int32_t)) {
   // handle error
}
int32_t int_value = *static_cast<int32_t*>(&(ip->value[0]));

对于逆序:

if (ip->value.size() != sizeof(int32_t)) {
   // handle error
}
int32_t int_value = static_cast<uint8_t>(ip->value[3]) |
                   (static_cast<uint8_t>(ip->value[2]) << 8) |
                   (static_cast<uint8_t>(ip->value[1]) << 16) |
                   (static_cast<uint8_t>(ip->value[0]) << 24);

很抱歉,由于转换范围变窄,因此需要强制转换(例如:当value [...] = 0x93 = -109时。

-string :两个想法,在这种情况下,以相反的顺序写入字符串(由此第一个元素为\\ 0

std::string str_value;
for (int idx = ip->value.size() - 1; idx > 0; idx--) {
   str_value += ip->value[idx];
}

该字符串以向前的顺序写入,并且需要跳过第一个字符(可能是前两个)。 在这种情况下。

if (ip->value.size() < 2) {
   // handle error
}
std::string str_value(ip->value.begin() + 2, ip->value.end());

暂无
暂无

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

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