2012-07-12 74 views
0

我正在接收const char * msg類型的某個size_t len的流。在某些字節中存在偏移有一個序列號(32或64字節,林不知道它),所以我的想法是做我每次得到的味精事情之一時間如下:尋找一系列char *緩衝區中的序列號?

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給了我連續的輸出結果。這個問題是我用類似的東西segfault:

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

我怎樣才能執行我的序列號的小搜索想法?

回答

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); 
0

那是你沒怎麼轉換字節爲int,你是tryi ng將一個指針取消引用到內存中不存在的位置。嘗試是這樣的:http://www.cplusplus.com/forum/beginner/3076/

+0

爲了清晰起見,我沒有包含字節順序(我做了一些事情)。我忘記了&。 – 2012-07-12 20:18:27

0

您做一個簡單的錯誤:消息[我]在我的位置返回字符的價值。要得到它的地址,你應該使用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呼叫留意。

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 - >步驟32位,因爲iter_p是一個字符。