![](/img/trans.png)
[英]Casting an unsigned int + a string to an unsigned char vector
[英]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.png读key == '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
根据图片,情况是:
-int : value
向量包含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.