2014-07-22 3 views
0

어떻게 검색하려고했으나 가장 좋은 방법은 찾지 못했습니다. Cubeia Firebase 서버를 사용하는 게임에서 소켓을 사용하여 연결하고 있습니다. 다음은 서버로부터받은 패킷입니다.벡터 unsigned char을 문자열/int로 변환

--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; 

내 문제는 string과 int에 대한 Param의 파서 키 값입니다. 나는 vector<uint8_8> value 포함, http://i.stack.imgur.com/Kjynp.png

당신이 볼 수 있듯이 INT 에 대한 문자열 http://i.stack.imgur.com/xlv9y.png

key == 'M'에 대한 key == 'N' 읽고 싶은 '\ 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]); 
} 

누구나 가장 이상적입니까? 여기 자바 코드이다 http://i.stack.imgur.com/hDn9b.png

답변

0

이미지에 따르면, 케이스는 :

- INT 다음 value 벡터는 순방향 순서 또는 역순이있을 int 값 4 개 요소 (포함). 처음에 크기가 4인지 확인하고 벡터 포인터를 int32_t (전달 순서)로 캐스팅하면 int를 읽을 수 있습니다. 예 : 역 순서

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

- 문자열 :

: 두 개의 아이디어를 역순으로 쓰기에 문자열이 경우 (이 첫 번째 요소로는 \ 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()); 
+0

감사합니다. NetVipeC. Int와 시도했지만 성공하지 못했습니다. 여기서 M은 10, 100, 2000, 10000, 50000 또는 200000 일 수 있으며 그 값을 가져올 필요가 있습니다. – vxhonghui

+0

특정 케이스를 게시 하시겠습니까? 이미지의 경우 연속 된 메모리 위치 [0], [1], [2], [3]입니다. 0x0,0x0,0x0,0xd, 샘플 코드 첫 번째 버전의 read int : int32_t int_value = * static_cast (& (ip-> value [0])); 0x0000000d (빅 엔디안)를 읽을 필요가있을 경우를 대비하여 (little endian으로) 0x0d000000을 읽습니다. , 캐스트와 함께 두 번째 코드가 필요합니다. – NetVipeC

관련 문제