Jak sprawdzić długość wiadomości

0

Mam taki kod w C

const static struct
{
        uint8               messsage[7];
        char                *str;

} service_start [] = {
        {{0x11 } ,"Adam"},
        {{0x11, 0x12, 0x12, 0x12, 0x12, 0x14, 0xA1} ,"Artur"},
        {{0x11, 0x12, 0x15, 0xA2, 0x12, 0x12} ,"Tomek"},
        {{0x11, 0x60} , "Kasia"},
};

Długość wiadomości Adam to jeden bajt (0x11)
Długość wiadomości Artur to 7 bajtów {0x11, 0x12, 0x12, 0x12, 0x12, 0x14, 0xA1}

Moje pytanie to : Jak sprawdzić jaka jest długość wiadomości Tomek ? (wiem, że wynosi 6, ale chciałbym jakąś funkcję która mi to zwróci)

3

Przy takim sposobie inicjalizacji messsage jest dopełniane zerami tab by cała tablica miała ustaloną wartość.
Ergo pytanie jest czy 0 może być traktowane przez twój kod jako znak końca wiadomości. To nie wygląda na tekst, więc raczej nie.
Zresztą Artur wypełia całą tablicą, więc nie ma zera końcowego, ergo logika polegająca na końcowym zerze zwiedzie w tym wypadku.

0

Np. tak, zakładając oczywiście, że w wiadomości nie może występować bajt o wartości zero

/* Funkcja */
int dl_wiad (uint8* wiadomosc) {
        int dl;

        dl = 0;
        while (*wiadomosc) {
                if (++dl >= 8)
                        break;
                ++wiadomosc;
                }

        return dl;
        }

/* Przykład użycia (dla wiadomości Tomek) */
dl_wiad (service_start[2].message);
1
#include<string.h>

/*...*/

size_t len = strnlen(service_start[2].message, 7);

Jeszcze wypadałoby maksymalny rozmiar tablicy zastąpić jakąś stałą.

3

Powyższe odpowiedzi mają sens jeśli można używać zer jako terminatora.
Jako, że typ tablicy to uint8[7] oraz, że dane wydaje się, że mogą zawierać zera (wygalają jak dane binarne niezwiązane z tekstem), to to założenie jest dość odważne.
Lepiej by było dostać więcej informacji od @xamrex

Może się okazać, że potrzebna jest mu dynamiczna tablica lub inny sposób na śledzenie długości danych,

0

Tak jak robisz to się nie da, chyba, że masz jakiś znak którego nie używasz. Np. zamieniasz uint8_t na int i zapełniasz EOF, a potem wysyłasz.

0

@elwis Yyy jest w standardzie taka funkcja jak strnlen? Nie ma jej w moim pliku string.h ani w dodatku B "Języka ANSI C".

1 użytkowników online, w tym zalogowanych: 0, gości: 1