2012-07-12 2 views
0

특정 size_t len의 const char * msg 유형 스트림을 수신 중입니다. 그 이후에 너무일련의 char * 버퍼에서 일련 번호를 찾으십니까?

for (int i = 0; i < 30; ++i) 
{ 
    uint32_t seq = *(uint32_t*) msg[i]; 
    cout << "seq" << i << " " << seq << endl; 
} 
//and similar for 64 bytes 

:이 오프셋 (offset) 일부 바이트에서 일련 번호가 나의 생각은 내가 MSG의 것들 중 하나 얻을 때마다 다음을 수행하는 것이 었습니다 (32 또는 64 바이트가, 확실하지 메신저) 동일한 오프셋을 사용하여 선을 그룹화하고 어떤 오프셋을 볼 수 있습니까? i은 연속적인 출력을 제공합니다. 이것의 문제는 다음과 같은 것들로 segfault와 같습니다 :

(gdb) p *(uint32_t*) msg[i] 
Cannot access memory at address 0x2d 

어떻게 시퀀스 번호에 대한 나의 작은 검색 아이디어를 수행 할 수 있습니까?

답변

2

시도 :

uint32_t seq = *(uint32_t*) &msg[i]; 

(gdb) p *(uint32_t*)&msg[i] 


편집 : 더 큰 변화, 잠재적으로 더 휴대용입니다 :

uint32_t seq; 
memcpy(&seq, msg + i, sizeof(seq)); 
seq = ntohl(seq); 
0

당신은 변환 할 방법이 바이트를 int로 바꾸면 tryi가됩니다. 메모리에있는 존재하지 않는 위치에 대한 포인터를 참조 해제합니다. 다음과 같이 시도하십시오 : http://www.cplusplus.com/forum/beginner/3076/

+0

명확성을 위해 엔디안을 포함하지 않았습니다 (나는 할 일을합니다). 나는 &를 잊어 버렸다. –

0

간단한 실수를하십시오. msg [i]는 위치 i에서 문자의 VALUE를 리턴합니다. 주소를 얻으려면 msg + i 또는 & msg [i]를 사용해야합니다. 그러나이 코드는 정렬되지 않은 단어를 읽을 수없는 일부 아키텍처에서는 이식 할 수 없습니다.

패킹 구조를 사용하는 정렬되지 않은 단어를 읽는 가장 좋은 방법 : 엔디안 문제와 htonl 호출에 대한

#pragma pack(1) 
struct Header { 
    uint32_t seq; 
}; 
#pragma pack() 

for (int i = 0; i < 30; ++i) 
{ 
    const Header *h = (const Header *)(msg + i); 
    cout << "seq" << i << " " << htonl(h->seq) << endl; 
} 

주의하십시오.

1
char msg[30]; 
for (int i = 0; i < 30; i++) 
    msg[i] = '\0'; 

char *iter_p = NULL; 
iter_p = msg; 

int i = 0; 
while (iter_p < &msg[30]) { 

    uint32_t seq = *(uint32_t *)iter_p; 
    cout << "seq" << i << " " << seq << endl; 
    iter_p += 4; 
    i++; 
} 

반복자 포인터를 반복하여 시도해보십시오. =)

iter_p가 문자이므로 iter_p + = 4 -> 32 비트 단계입니다.

관련 문제