0

我正在接收某个 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

4 回答 4

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);
于 2012-07-12T20:02:09.363 回答
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 --> step 32 位,因为 iter_p 是一个字符。

于 2012-07-12T21:53:15.640 回答
0

您犯了一个简单的错误: msg[i] 返回位置 i 处的字符的 VALUE。要获取它的地址,您应该使用 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 调用。

于 2012-07-12T20:45:08.820 回答
0

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

于 2012-07-12T20:04:24.133 回答