Разделите строку 32 на 4 8 гекса в с - PullRequest
0 голосов
/ 22 февраля 2019

сообщество, у меня мало опыта работы с Си, и я сейчас нахожусь на кривой обучения.

Я работаю над небольшим проектом, который предполагает разделение 32-символьной строки на 4 строки по 8 символов в каждой.C. 32-символьная строка должна напоминать 32-битную инструкцию.Эти «32 бита» разделены на 4 «8-битные» строки, которые я хочу распечатать как Hex.Код ниже - это то, что я получил до сих пор.Я использую типы данных, которые я использую в остальной части моего кода.Я намереваюсь передать переменную unsigned char t в программу Substitution Box, которая даст мне эквивалент этого t символа из таблицы поиска S-Box.

Мне кажется, что приведенный ниже код должен работать

unsigned char inst[] = "10101010101010101111111100111101";
unsigned char in[8];
for (int i = 0; i < 33; i++){
        if (i%8 == 0 && i != 0) {
                unsigned char t = (unsigned char) strtol(in, NULL, 2);
                printf("%x \n", t);
    }

    in[i%8] = inst[i];
    printf("%c ", in[i%8]);
}

но вывод выглядит так:

1 0 1 0 1 0 1 0 3d
1 0 1 0 1 0 1 0 3d
1 1 1 1 1 1 1 1 3d
0 0 1 1 1 1 0 1 3d

Я вижу, что строка in[i%8] = inst[i]; правильно читает chars из inst[], но

if (i%8 == 0 && i != 0) {
                unsigned char t = (unsigned char) strtol(in, NULL, 2);
                printf("%x \n", t);
    }

Условный оператор печатает неправильный гекс.Вывод должен выглядеть примерно так:

1 0 1 0 1 0 1 0 aa
1 0 1 0 1 0 1 0 aa
1 1 1 1 1 1 1 1 ff
0 0 1 1 1 1 0 1 3d

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Проблемы с текущим кодом:

  • "4 строки по 8 символов в каждой" равно char in[4][8+1];, а не char in[8].Вам нужно место для нулевого завершения.
  • 32 бита означает итерацию от 0 до 31, а не от 0 до 32.
  • Нет необходимости копировать байт на байт.Это медленно и делает все излишне сложным.

Это, кажется, требования:

  • Разделить исходную строку на 4 подстроки.
  • Конвертировать каждуюподстрока в целое число.
  • Отображение результата в шестнадцатеричном виде

В этом случае вы можете просто выполнить итерацию 4 раза по входной строке:

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

int main (void)
{
  const char* inst = "10101010101010101111111100111101";
  char in [4][8+1];

  puts("Bin      Hex");
  for(size_t i=0; i<4; i++)
  {
    memcpy(in[i], &inst[i*8], 8);
    in[i][8] = '\0';
    unsigned long val = strtoul(in[i], NULL, 2);    
    printf("%.8s %.2lX\n", in[i], val);
  }
}

Вывод:

Bin      Hex
10101010 AA
10101010 AA
11111111 FF
00111101 3D
0 голосов
/ 22 февраля 2019

Проблема в том, что ваш in не NUL завершен.

Таким образом, передача in в strol вызывает неопределенное поведение.

Doкак показано ниже.

    unsigned char in[9]; //+1 to hold the NUL char.

     ....
    if (i%8 == 0 && i != 0) {
                in[8] = '\0'; //NUL terminate the string.
                unsigned char t = (unsigned char) strtol(in, NULL, 2);
                printf("%x \n", t);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...