将vector unsigned char转换为string / int

时间:2014-07-22 02:22:01

标签: c++ ios

我确实试图搜索,但找不到最好的方法。 我正在使用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

对于int,

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

1 个答案:

答案 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());