Обратное преобразование строки в int - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть функция PostProcess, которая исправлена ​​и не может измениться. Он принимает массив из 6 байтов и выводит 24-битное значение.

Я пытаюсь понять, что для данного 24-битного числа какая функция PreProcess выдаст мне те же выходные и входные значения.

Например, если я установлю свое входное значение чтобы быть 2^24 -1 = 16777215, тогда я ожидал бы получить 16777215 на выходе.

Не ясно, как бы я реализовал эту функцию. Я добавил код ниже с тестом и функциональностью PostProcess

void PreProcess(unsigned int in, unsigned char out[]);
int PostProcess(unsigned char pu8Input[]);

int main()
{
    unsigned int InputVal = 16777215; // max value for 24 bits
    unsigned char PreProcessed[6] = {0};

    PreProcess(InputVal,PreProcessed);    

    unsigned int OutputVal = PostProcess(PreProcessed);

    if(InputVal == OutputVal)
        printf("True!");
    else
        printf("False");

    return 0;
}

void PreProcess(unsigned int in, unsigned char out[])
{
    //TODO
}

int PostProcess(unsigned char pu8Input[])
{
    unsigned int u32Out = 0u; 

    u32Out += (pu8Input[0] - '0') * 100000;
    u32Out += (pu8Input[1] - '0') * 10000;
    u32Out += (pu8Input[2] - '0') * 1000;
    u32Out += (pu8Input[3] - '0') * 100;
    u32Out += (pu8Input[4] - '0') * 10;
    u32Out += (pu8Input[5] - '0') * 1;
    u32Out &= 0xFFFFFF;

    return u32Out;
}

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

отменить операцию

Примечание; с in > 999999, out[0] будет вне диапазона '0' - '9'.

void PreProcess(unsigned int in, unsigned char out[]) {
  in &= 0xFFFFFFu; // Enforce 24-bit limit.
  for (int index = 5; index > 0; index--) {
    out[index] = in%10u + '0';
    in /= 10u;
  }
  // `in` will be 0 to 167
  out[0] = in + '0;
  // With ASCII, `out[0]` will be 48 to 215
}
1 голос
/ 30 апреля 2020

Входное целое число может иметь максимальное значение 2^24 - 1, массив символов длиной 6 байтов ... имея возможность изменить PostProcess(), это было бы легко: 6 символов - это как раз то, что требуется для хранения 24-битное целое число в формате HEX. Символ каждые 4 байта; максимальное значение (0x) FFFFFF.

Но реализация PostProcess() исправлена ​​и имеет вид "max-6-digits-atoi" . Таким образом, если значение входного буфера равно {'3', '4', '5', '6', '7', '8'}, то целое число 345678.

Кажется, что 999999 может быть напечатано не более, , но здесь возникает хитрость : кто ли нам хранить в буфере символов только цифры? У нас нет никаких ограничений (но мы должны полагаться на ASCII схему кодирования).


Стратегия

  1. Давайте удостоверимся, что Чтобы 5 байтов буфера символов содержали десятичное представление входного числа. Таким образом, PostProcess преобразует эти цифры, как и ожидалось. Значение этих цифр может быть вычислено как in % 100000
  2. Будучи максимальным входным значением 2^24-1 = 16777215, мы должны представить диапазон [0-167] с первым байтом массива
  3. , так как PostProcess вычтет '0' из pu8Input[0], мы обязательно компенсируем его при генерации pu8Input[0]

кода

#include <stdio.h>
#include <string.h>

void PreProcess(unsigned int in, unsigned char out[])
{
    if(in <= 16777215)
    {
      char aux[7];
      unsigned int auxInt = in % 100000;
      unsigned char firstchar;

      firstchar = (in / 100000) + '0';

      sprintf( aux, "%c%05u", firstchar, auxInt );

      memcpy( out, aux, 6 );
    }
}

Суммируя:

  1. Мы вычисляем остаток auxInt = in % 100000
  2. Мы вычисляем ведущий символ как firstchar = (in / 100000) + '0'
  3. Мы складываем их вместе с sprintf, используя вспомогательный символ буфер длиной 7 байт (потому что нам нужно место для ограничителя строки)
  4. Мы memcpy вспомогательный буфер символов для буфера вывода
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...