2013-08-13 4 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; 
} 

Но этот метод, когда полезная нагрузка == 126 или 127 возвращает неправильный результат (всегда огромное количество), кто-то может обнаружить ошибку?Расшифровка длины полезной нагрузки в формате Cs

Я знаю, что отправил сообщение из 250 символов. Это являются первые 5 байт I реанимировать преобразуется в двоичную:

[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 

ответ

1

Вы пропускаете преобразование значения из сетевого порядка байтов в машинную последовательность байт. 64000 - 11111010 00000000 в двоичном формате. Вам нужно использовать процедуры преобразования порядка байтов.

payloadLength = ntohs(payloadLength16b); 

    payloadLength = (size_t)ntohll(payloadLength64b); 

Если в вашей системе отсутствует определение ntohll, вы можете следить за предлагаемые ответы на this question. Но, возможная реализация может быть:

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' является 1111101000000000' в двоичном коде, так что кажется, что я был прав. – jxh

Смежные вопросы