2013-08-13 1 views
1
size_t getPayloadLength(const unsigned char *inputFrame){ 
    size_t payloadLength = inputFrame[1] & 0x7F; 

    if (payloadLength == 0x7E) { 
    uint16_t payloadLength16b = 0; 
    memcpy(&payloadLength16b, &inputFrame[2], 2); 
    payloadLength = payloadLength16b; 

    } else if (payloadLength == 0x7F) { 
    uint64_t payloadLength64b = 0; 
    memcpy(&payloadLength64b, &inputFrame[2], 8); 
    payloadLength = (size_t)payloadLength64b; 
    } 

    return payloadLength; 
} 

Mais cette méthode lorsque la charge utile est == 126 ou 127 renvoie un mauvais résultat (toujours un nombre énorme) quelqu'un peut repérer l'erreur?Décodage longueur de la charge utile Websocket en C

Je sais que j'ai envoyé un message de 250 caractères. Ce sont les 5 premiers octets I Revive converti en binaire:

[0] 10000001 
[1] 11111110 // & 0x7F = 126 -> so payload length is byte 2 3 interpreted as 16 bit 
[2] 00000000 // 
[3] 11111010 // 0000000011111010 = 250 but my function returns 64000 
[4] 10001001 

Répondre

1

Il vous manque la conversion de vos valeurs de l'ordre des octets du réseau pour héberger l'ordre des octets. 64000 est 11111010 00000000 en binaire. Vous devez utiliser les routines de conversion d'ordre d'octet.

payloadLength = ntohs(payloadLength16b); 

    payloadLength = (size_t)ntohll(payloadLength64b); 

Si votre système n'a pas une définition pour ntohll, vous pouvez suivre les réponses proposées à this question. Mais, une implémentation possible pourrait être:

uint64_t ntohll (uint64_t x) { 
    const unsigned t = 1; 
    if (*(const unsigned char *)&t) { 
     x = ((uint64_t)ntohl(x & 0xffffffffU) << 32) 
      | ntohl((uint32_t)(x >> 32)); 
    } 
    return x; 
} 
+0

@Gavello: '64000' est' 1111101000000000' en binaire, donc il semble que j'avais raison. – jxh

Questions connexes