2017-05-26 82 views
1

我有一個字符的字符串:拆分焦炭引入字符數組

uint8_t word[40] = "a9993e364706816aba3e25717850c26c9cd0d89d"; 

我需要以某種方式將其分割成字符數組,所以它看起來像這樣:

uint32_t hfFile[5]; 
hfFile[0] = 0xa9993e36; 
hfFile[1] = 0x4706816a; 
hfFile[2] = 0xba3e2571; 
hfFile[3] = 0x7850c26c; 
hfFile[4] = 0x9cd0d89d; 

後來我想檢查,其他數組元素是否等於hfFile的元素。

我的問題是,我不知道如何來提取字符的字符串確切的部分,以及它將如何工作,如果

another_array[0] = 0xa9993e36; 

這個樣子的?

+2

爲什麼你使用C風格的字符串而不是C++字符串? – CroCo

+0

使用字符比使用字符串更快,我需要我的代碼儘可能快 – Yokz

+1

你打算如何使用它?你需要副本還是僅查看數據? –

回答

3

使用std::string,然後,你可以使用string::substr做到這一點:

std::string word = "a9993e364706816aba3e25717850c26c9cd0d89d"; 
std::string hfFile[5]; // or use std::vector instead of C-array 
hfFile[0] = word.substr(0, 8); 
hfFile[1] = word.substr(8, 16); 
hfFile[2] = word.substr(16, 24); 
hfFile[3] = word.substr(24, 32); 
hfFile[4] = word.substr(32, 40); 

然後比較可以如此簡單:

if(hfFile[0] == "a9993e36") 
    std::cout << "equal\n"; 

做法贏得不會傷害表演。編譯優化標誌,你會沒事的。我懷疑你是這裏過早優化的受害者。

+0

有沒有任何可能的方式避免使用字符串?我想保持代碼儘可能低級,只能使用字符操作 – Yokz

+0

@Yokz:爲什麼這麼說 –

+0

@BoundaryImposition:它是algorythm的一小部分,這部分將會被使用50000次或更多,因此我想盡快保持它 – Yokz

2

你可以做這樣的事情:

int length = strlen(word); 

for(int i = 0; (i*8) < length; i++) 
{ 
    strncpy(hfFile[i], word + i*8, 8); 
} 

如果你想對那些hfFile字符串與another_array[0] = "0xa9993e36"比較,你能做到這一點,像這樣:

if(strncmp(hfFile[0], another_array[0] + 2, 8) == 0) ... 

+2用於跳過0xanother_array

請注意,此代碼不包含任何錯誤檢查G。

另請注意,我建議使用std::string而不是C風格的字符串!

+0

6或8?我沒有做數學; p – gsamaras

+0

@gsamaras它是8你說得對:-)現在是正確的 –

+0

@gsamaras:嗯,我認爲它應該是正確的,因爲如果'i'是1我從'word + i * 8'開始於char 8.或者你看到哪個問題? –