我确实试图搜索,但找不到最好的方法。 我正在使用cubeia firebase服务器开发游戏,使用socket连接。以下是从服务器收到的数据包:
--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;
我的问题是Param到string和int的解析器键值。
我想读一下key == 'N'
字符串
http://i.stack.imgur.com/xlv9y.png
和key == '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
答案 0 :(得分:0)
根据图像,案例是:
- 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);
由于转换范围缩小,所以需要演员,例如:当值[...] = 0x93 = -109时。
- string :两个想法,在相反的顺序中写入的字符串(在这种情况下,第一个元素是 \ 0 ,最可能):
std::string str_value;
for (int idx = ip->value.size() - 1; idx > 0; idx--) {
str_value += ip->value[idx];
}
字符串以正向顺序写入,需要跳过第一个字符(可能是前2个字符)。在这种情况下。
if (ip->value.size() < 2) {
// handle error
}
std::string str_value(ip->value.begin() + 2, ip->value.end());