2016-11-07 13 views
-1

enter image description hereКак извлечь поле «3 бита» из указанной ниже формат строки

Привет,

Скажем у меня есть строка, как «888820c8». Как я могу получить эти 3 бита в int на языке программирования c?

UPDATE 1 -

Это то, что я был в состоянии сделать

static const char* getlast(const char *pkthdr) 
{ 
    const char *current; 
    const char *found = NULL; 
    const char *target = "8888"; 
    int index = 0; 
    char pcp = 0; 

    size_t target_length = strlen(target); 
    current = pkthdr + strlen(pkthdr) - target_length; 

    while (current >= pkthdr) { 
     if ((found = strstr(current, target))) { 
      printf("found!\n"); 
      break; 
     } 
     current -= 1; 
    } 

    if(found) 
    { 
     index = found - pkthdr; 
     index += 4; /*go to last of 8188*/ 
    } 
    printf("index %d\n", index); 
    /* Now how to get the next 3 bits*/ 

    printf("pkthdr %c\n", pkthdr[index]); 

    pcp = pkthdr[index] & 0x7; 
    printf("%c\n", pcp); 
    return pcp; 
} 

Очевидно, я знаю, последняя часть моей программы не так и любые входы были бы полезны. благодаря!

Update 2:

Благодаря Pratik для указателя. Этот код выглядит хорошо сейчас?

static char getlast(const char *pkthdr) 
{ 
    const char *current; 
    const char *found = NULL; 
    const char *tpid = "8188"; 
    int index = 0; 
    char *pcp_byte = 0; 
    char pcp = 0; 
    int pcp2 = 0; 
    char byte[2] = {0}; 
    char *p; 
    unsigned int uv =0 ; 

    size_t target_length = strlen(tpid); 
    current = pkthdr + strlen(pkthdr) - target_length; 
    //printf("current %d\n", current); 

    while (current >= pkthdr) { 
     if ((found = strstr(current, tpid))) { 
      printf("found!\n"); 
      break; 
     } 
     current -= 1; 
    } 

    found = found + 4; 

    strncpy(byte,found,2); 
    byte[2] = '\0'; 

    uv =strtoul(byte,&p,16); 

    uv = uv & 0xE0; 
    char i = uv >> 5; 
    printf("%d i",i); 
    return i; 
} 
+0

Это не «строковый формат». Но чтобы решить вашу проблему, написать программу было бы хорошей идеей. Не стесняйтесь задавать ** конкретный ** вопрос, если это проветривается. Не забудьте предоставить [mcve] и следуйте советам в [ask]. – Olaf

+2

И «маскировка» и «бит-сдвиг» могут быть хорошими условиями для начала исследования. –

+0

Если сначала в текстовом формате вы можете применить 'strtol', чтобы преобразовать его во внутреннее двоичное представление, а затем применить маску и сдвиг, или сдвиг и маску. Но что вы пробовали? Мы не хотели бы публиковать решение pat, в котором вы, похоже, не начали. –

ответ

1

Код, который у вас есть местонахождение персонажа, содержит 3 бита, которые вы хотите. Этот символ будет цифрой ('0' thru '9'), прописную букву ('A' через 'F') или строчную букву ('a' через 'f'). Таким образом, первая задача состоит в том, чтобы преобразовать символ в его числовой эквивалент, например. например

unsigned int value; 
if (sscanf(&pkthdr[index], "%1x", &value) != 1) 
{ 
    // handle error: the character was not a valid hexadecimal digit 
} 

На данный момент у вас есть 4-битное значение, но вы хотите извлечь верхние три бита. Это можно сделать с помощью сдвига и маскировки, например.

int result = (value >> 1) & 7; 
printf("%d\n", result); 

Обратите внимание, что если вы хотите, чтобы вернуть 3-разрядное число из функции, прототип функции должен быть изменен, чтобы возвращать int, например,

static int getlast(const char *pkthdr) 
{ 
    // ... 
    return result; 
} 
+0

плюс один для объяснения! – Coder

1

Прочитайте эту строку массив символов данных Char [8] = "888820c8" (данные [4] & 0xE0) >> 5 Ваш анс

+0

просто не нужно использовать маску – nopasara