C++ 在一系列char*缓冲区中查找序列号?
我正在接收一个特定大小的const char*msg类型的流。在其中的某个字节偏移量处有一个序列号(32或64字节,我不确定是哪个),所以每次我得到一个消息时,我的想法是执行以下操作:C++ 在一系列char*缓冲区中查找序列号?,c++,c,gdb,C++,C,Gdb,我正在接收一个特定大小的const char*msg类型的流。在其中的某个字节偏移量处有一个序列号(32或64字节,我不确定是哪个),所以每次我得到一个消息时,我的想法是执行以下操作: for (int i = 0; i < 30; ++i) { uint32_t seq = *(uint32_t*) msg[i]; cout << "seq" << i << " " << seq << endl; } //and
for (int i = 0; i < 30; ++i)
{
uint32_t seq = *(uint32_t*) msg[i];
cout << "seq" << i << " " << seq << endl;
}
//and similar for 64 bytes
我如何实现搜索序列号的想法?试试:
uint32_t seq = *(uint32_t*) &msg[i];
及
编辑:一个可能更便于移植的更大变化是:
uint32_t seq;
memcpy(&seq, msg + i, sizeof(seq));
seq = ntohl(seq);
尝试:
及
编辑:一个可能更便于移植的更大变化是:
uint32_t seq;
memcpy(&seq, msg + i, sizeof(seq));
seq = ntohl(seq);
这不是将字节转换为int的方式,而是尝试取消对内存中不存在的位置的指针的引用。尝试这样的操作:这不是将字节转换为int的方式,而是尝试取消对内存中不存在的位置的指针的引用。尝试以下操作:您犯了一个简单的错误:msg[i]返回位置i处的字符值。要获取它的地址,您应该使用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;
}
#pragma包(1)
结构头{
uint32_t seq;
};
#pragma pack()
对于(int i=0;i<30;++i)
{
常数头*h=(常数头*)(msg+i);
您可能会犯一个简单的错误:msg[i]返回位置i处字符的值。要获取它的地址,您应该使用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;
}
#pragma包(1)
结构头{
uint32_t seq;
};
#pragma pack()
对于(int i=0;i<30;++i)
{
常数头*h=(常数头*)(msg+i);
coutcharmsg[30];
对于(int i=0;i<30;i++)
msg[i]='\0';
char*iter_p=NULL;
iter_p=味精;
int i=0;
而(国际热核实验堆<&msg[30]){
国际热核试验堆;
coutcharmsg[30];
对于(int i=0;i<30;i++)
msg[i]='\0';
char*iter_p=NULL;
iter_p=味精;
int i=0;
而(国际热核实验堆<&msg[30]){
国际热核试验堆;
我可以不包括结尾只是为了清楚(我做了很多事情)。我忘记了&。我没有包括结尾只是为了清楚(我做了很多事情)。我忘记了&。
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++;
}