Ejemplo de monitoreo de la frecuencia cardíaca de Apple y orden de bytes de las características de medición de la frecuencia cardíaca bluetooth

En las características de medición de la frecuencia cardíaca:

http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml

Quiero asegurarme de que lo estoy leyendo correctamente. ¿Eso dice realmente 5 campos? ¿El obligatorio, C1, C2, C3, y C4? Y lo obligatorio está en el primer byte, y C4 está en los últimos dos bytes, C1 y C2 son campos de 8 bits, y C3 a C4 son de 16 bits cada uno. Eso es un total de 8 bytes. ¿Estoy leyendo este documento correctamente?

EDITAR:

Estoy informado de que los campos de bandera obligatorios indican que algo es 0, significa que simplemente no está allí. Por ejemplo, si el primer bit es 0, C1 es el siguiente campo, si 1, C2 lo sigue.

EDICIÓN FINAL

En AppleEjemplo de monitor de frecuencia cardiaca OSX:

- (void) updateWithHRMData:(NSData *)data 
{
    const uint8_t *reportData = [data bytes];
    uint16_t bpm = 0;

    if ((reportData[0] & 0x01) == 0) 
    {
        /* uint8 bpm */
        bpm = reportData[1];
    } 
    else 
    {
        /* uint16 bpm */
        bpm = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[1]));
    }

    ... // I ignore rest of the code for simplicity
}

Verifica el primer bit como cero, y si no lo es, está cambiando el endianness a cualquiera que sea el orden de bytes del host, aplicando CFSwapInt16LittleToHost areportData[1].

¿Cómo funciona esa comprobación de bits? No estoy completamente seguro de la endianess. ¿Está diciendo que si es pequeño o grande, el primer byte es siempre el campo obligatorio, el segundo byte es el C1, etc.? Y dado que reportData es un puntero de 8 bits (typedef paraunsigned char), está comprobando el bit 0 o el bit 8 del campo obligatorio.

Si ese bit es el bit 8, el bit está reservado para uso futuro, ¿por qué está leyendo allí?

Si ese bit es 0, es little-endian y no se requiere ninguna transformación? Pero si es little-endian, el primer bit podría ser 1 según la especificación, 1 significa "El formato del valor de la frecuencia cardíaca está establecido en UINT16. Unidades: latidos por minuto (bpm)", ¿no se puede interpretar erróneamente?

No entiendo cómo se hace la comprobación.

EDITAR: Seguí diciendo que había C5, que fue un error. Es solo para C4 y edité arriba.

Respuestas a la pregunta(2)

Su respuesta a la pregunta