J'ai le code suivant dans C pour calculer un CRC16-USB pour certains flux de données: où croc16_table em> est une matrice de 2 valeurs hexagonales de 2 Les octets (comme 0xaff3), et Data em> sont une matrice de valeurs hexagonales de 1 octet (comme 0xa3) représentant le flux de données (AQCUIRELIÉ par d'autres moyens). Taille em> est la longueur de la matrice Data em>. p> Je veux reproduire ce morceau de code dans Python, mais je ne sais pas que cette déclaration Moyens: P> index = ((uint8_t*) & init)[1] ^ *data++;
3 Réponses :
L'intention de l'index Dans l'énoncé Cependant, la norme C n'exige pas que les octets d'un Ainsi, le code aurait pu être simplement: p> = ((uint8_t *) & init) [1] ^ * Data ++; code> L'instruction est sur XOR les huit bits élevés de
init code> avec le Next octet de
données code> (et d'incrémenter `données). Malheureusement, il est écrit mal.
Index = ((uint8_t *) & init) [1] ^ * Data ++; Code>: P>
& init code> prend l'adresse de
init code> (qui a été défini avec
uint16_t init = crcbase; code>). Li>
(uint8_t *) code> convertit cette adresse à un pointeur vers
uint8_t code>. L'utilisation ultérieure de ce pointeur nécessite que
uint8_t code> soit un type de caractère dans la mise en oeuvre C, qui est probable mais n'est pas garanti par la norme C. li>
[1] code> sur ce pointeur récupère l'octet suivant au-delà de l'endroit où le pointeur pointe. Le fait que la deuxième ligne utilise
init << 8 code>, ce qui entraîne une valeur uniquement dépendante du * ** huit bits de
init code>, suggère que l'intention de cette La première ligne consistait à récupérer les
init code>. li>
ul>
uint16_t code> soient dans une commande particulière, il n'est donc pas assuré que l'utilisation de
[1] code > va chercher les bits souhaités. Et il n'est pas nécessaire; Utilisation de
init >> 8 code> à la place de
((uint8_t *) & init) [1] code> fournirait les bits souhaités. P>
Cette adresse est ensuite utilisée avec un opérateur d'indice - graphiquement: p> SO, fondamentalement, vous saisissez les 8 bits inférieurs de init code> a le type
uint16_t code>, donc l'expression expression em>
& init it> a type "pointeur sur
uint16_t < / code> "ou
uint16_t * code>. L'expression
(uint8_t *) & init code> signifie "Obtenez l'adresse de
init code>, mais traitez-la comme l'adresse d'un
uint8_t code> objet, plutôt que
uint16_t code> objet ".
((uint8_t *) & init) [1] code>, qui est essentiellement équivalent à" traiter < Code> init code> comme une matrice de deux
uint8_t code> objets et donnez-moi la valeur du deuxième élément dans ce tableau ". p>
init code>, Ça avec La valeur de l'octet actuel du message d'entrée, puis avancez
data code> pour pointer sur l'octet suivant du message d'entrée. p> p>
J'ai trouvé une solution pour mon problème, avec le code suivant:
def calculateCRC16(data): init = 0xFFFF for byte in data: index = (init >> 8) ^ byte init = ((init << 8) ^ crc16_table[index]) & 0xFFFF return init
Il jette l'adresse d'un
uint16_t code> variable pour être un pointeur sur
uint8_t code>.
Il s'agit de deuxième octet de
init code> et de xoriser avec valeur pointée par
data code>, augmentation des données
code> après cela.