Exemplo de monitoração da frequência cardíaca da Apple e ordem de byte das características de medição da frequência cardíaca do bluetooth

Nas características de medição da freqüência cardíaca:

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

Quero ter certeza de que estou lendo corretamente. Isso realmente diz 5 campos? Os obrigatórios, C1, C2, C3 e C4? E a obrigatória está no primeiro byte, e C4 está nos dois últimos bytes, C1 e C2 são campos de 8 bits e C3 a C4 são de 16 bits cada. Isso é um total de 8 bytes. Estou lendo este documento corretamente?

EDITAR:

Sou informado de que os campos de sinalização obrigatórios indicam que algo é 0, o que significa que simplesmente não está lá. Por exemplo, se o primeiro bit for 0, C1 será o próximo campo, se 1, C2 seguir em vez disso.

END EDIT

Na AppleExemplo de monitor de frequência cardíaca 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
}

Ele verifica o primeiro bit como zero e, se não estiver, está alterando o pouco de endianness para qualquer ordem de byte do host, aplicando CFSwapInt16LittleToHost areportData[1].

Como essa checagem de bits funciona? Eu não estou totalmente certo de endianess. Está dizendo que seja pequeno ou grande, o primeiro byte é sempre o campo obrigatório, o segundo byte é o C1, etc? E desde reportData é um ponteiro de 8 bits (typedef paraunsigned char), está verificando o bit 0 ou o bit 8 do campo obrigatório.

Se esse bit é bit 8, o bit é reservado para uso futuro, por que ele está lendo lá?

Se esse bit é 0, é little-endian e nenhuma transformação é necessária? Mas se for little-endian, o primeiro bit pode ser 1 de acordo com a especificação, 1 significa que "Heart Rate Value Format está definido como UINT16. Units: batidas por minuto (bpm)", não poderia ser mal interpretado?

Eu não entendo como isso faz a verificação.

EDIT: Eu continuei dizendo que havia C5, que foi um erro. Cabe apenas ao C4 e eu editei acima.

questionAnswers(2)

yourAnswerToTheQuestion