2017-05-26 1 views
1

J'ai une chaîne char:Fractionnement omble dans un tableau char

uint8_t word[40] = "a9993e364706816aba3e25717850c26c9cd0d89d"; 

je dois en quelque sorte il divisé en tableau de caractères, il ressemblerait à ceci:

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

Plus tard, je veux check, les autres éléments du tableau sont égaux aux éléments du hfFile.

Mon problème est, je ne sais pas comment extraire des portions exactes de chaîne de char, et comment il fonctionne, si

another_array[0] = 0xa9993e36; 

ressembler à ceci?

+2

Pourquoi? – CroCo

+0

travailler avec des caractères est plus rapide qu'avec des chaînes, et j'ai besoin de mon code pour être aussi rapide que possible – Yokz

+1

Comment allez-vous utiliser cela? Avez-vous besoin de copies ou seulement des vues des données? –

Répondre

3

Utilisez std::string puis, vous pouvez utiliser string::substr pour ce faire:

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

Et la comparaison peut être aussi simple que cela:

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

Suivant l'approche gagné ne blesse pas la performance. Compilez avec des drapeaux d'optimisation et tout ira bien. Je soupçonne que vous êtes victime d'une optimisation prématurée ici.

+0

Y a-t-il un moyen possible d'éviter d'utiliser des chaînes de caractères? Je veux garder le code aussi bas que possible, fonctionnant avec des caractères seulement – Yokz

+0

@Yokz: Pourquoi est-ce –

+0

@BoundaryImposition: c'est une petite partie de l'algorythme, et cette partie va être utilisée comme 50000 fois ou plus, donc je voulez le garder aussi vite que possible – Yokz

2

Vous pouvez faire quelque chose comme ceci:

int length = strlen(word); 

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

Et si vous voulez comparer les chaînes de hfFile avec another_array[0] = "0xa9993e36" vous pouvez le faire comme ceci:

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

Le +2 est utilisé pour sauter 0x au début de another_array

Veuillez noter que ce code ne contient aucune erreur. g.

Veuillez également noter que je recommande d'utiliser std::string au lieu de chaînes de style C! Pourquoi utiliser une chaîne de style C au lieu de la chaîne C++?

+0

6 ou 8? Je n'ai pas fait le calcul, p – gsamaras

+0

@gsamaras C'est 8 Vous avez raison :-) C'est correct maintenant –

+0

@gsamaras: Eh bien, je pense que ça devrait être correct car si 'i' est 1 je copie de' word + i * 8' qui commence au char 8. Ou quel problème voyez-vous? –