我正在接收某个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
如何对序列号执行我的小搜索?
答案 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调用。