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
最佳答案
您缺少从网络字节顺序到主机字节顺序的值转换。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;
}
关于c - 用C解码Websocket有效负载长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18221087/