2012-07-12 76 views
0

我正在接收const char * msg类型的某个size_t len的流。在某些字节中存在偏移有一个序列号(32或64字节,林不知道它),所以我的想法是做我每次得到的味精事情之一时间如下:寻找一系列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 

,这样以后我可以将具有相同偏移量的行分组,并查看哪个偏移量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 ng将一个指针取消引用到内存中不存在的位置。尝试是这样的:http://www.cplusplus.com/forum/beginner/3076/

+0

为了清晰起见,我没有包含字节顺序(我做了一些事情)。我忘记了&。 – 2012-07-12 20:18:27

0

您做一个简单的错误:消息[我]在我的位置返回字符的价值。要得到它的地址,你应该使用msg + i或者& msg [i]。 但是,对于某些无法读取未对齐字的体系结构,此代码不可移植。

读取未对齐字是使用包装结构的最佳方式:

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

的尾数问题,htonl呼叫留意。

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 + = 4 - >步骤32位,因为iter_p是一个字符。