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の場合、このメソッドは間違った結果を返します(常に膨大な数です)誰かがエラーを見つけることができますか?

私は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 
4

1 に答える 1

1

ネットワーク バイト オーダーからホスト バイト オーダーへの値の変換がありません。6400011111010 00000000バイナリです。バイトオーダー変換ルーチンを使用する必要があります。

    payloadLength = ntohs(payloadLength16b);

    payloadLength = (size_t)ntohll(payloadLength64b);

システムに の定義がない場合は、この質問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;
}
于 2013-08-14T00:55:47.890 に答える