在一系列char *缓冲区中查找序列号?

时间:2012-07-12 19:58:59

标签: c++ c gdb

我正在接收某个size_t len的const char * msg类型的流。在那里的某个字节偏移处有一个序列号(32或64字节,我不确定哪个)所以我的想法是每次我得到一个msg的东西时做以下事情:

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给出了顺序查看输出。这个问题是我用以下内容进行了段错误:

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

如何对序列号执行我的小搜索?

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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 - &gt;步骤32位,因为iter_p是一个字符。

答案 2 :(得分:0)

这不是你如何将字节转换为int,你试图取消引用指向内存中不存在的位置的指针。尝试这样的事情:http://www.cplusplus.com/forum/beginner/3076/

答案 3 :(得分:0)

你犯了一个简单的错误:msg [i]返回位置i的char的VALUE。要获取它的地址,您应该使用msg + i或&amp; 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;
}

注意endian问题和htonl调用。