0

特定のsize_tlenのconstchar*msgタイプのストリームを受信して​​います。そこにあるバイトオフセットにはシーケンス番号(32バイトまたは64バイト、どちらかわからない)があるので、私の考えは、メッセージのいずれかを取得するたびに次のことを行うことでした。

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は文字であるため、iter_p +=4->ステップ32ビット。

于 2012-07-12T21:53:15.640 に答える
0

これは、バイトをintに変換する方法ではなく、存在しないメモリ内の場所へのポインタを逆参照しようとしています。次のようなものを試してください:http ://www.cplusplus.com/forum/beginner/3076/

于 2012-07-12T20:04:24.133 に答える
0

単純な間違いを犯します。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;
}

エンディアンの問題とhtonlの呼び出しに注意してください。

于 2012-07-12T20:45:08.820 に答える