簡體   English   中英

用C解碼Websocket有效負載長度

[英]Decoding Websocket payload length in C

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時,此方法返回錯誤的結果(總是很大的數字),有人可以發現錯誤嗎?

我知道我已經發送了250個字符的消息。 這是我恢復為二進制文件的前5個字節:

[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 

您缺少從網絡字節順序到主機字節順序的值轉換。 6400011111010 00000000二進制。 您需要使用字節順序轉換例程。

    payloadLength = ntohs(payloadLength16b);

    payloadLength = (size_t)ntohll(payloadLength64b);

如果您的系統缺少ntohll的定義, ntohll可以遵循有關此問題的建議答案。 但是,可能的實現方式可能是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM