Печать шестнадцатеричного массива в консоли - PullRequest
0 голосов
/ 24 мая 2018

У меня есть массив типа uint8_t, размеры 4x4, я использую вложенные циклы для отображения массива, шестнадцатеричные значения преобразуются в шестнадцатеричную строку через sprintf().

void hexD(uint8_t state[4][4])
{
char x[2];
for(int i = 0; i < 4; i++)
{
    cout << "\n";
    for(int  j = 0; j < 4; j++)
    {
        cout << j <<"\n"; //displays the value of j
        sprintf(x, "%x", state[i][j]);
        cout << x << "\t";
    }
}
}

Проблема заключается вВнутренний цикл for, который работает бесконечно, так как значение j начинается с 0, затем 1, затем 2, но вместо перехода к 3 он возвращается к 1, j переключается между 1 и 2, таким образом, цикл работает бесконечно.

Любые решенияна это.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

В зависимости от ваших значений в state[4][4], вы, скорее всего, в конечном итоге переполните массив x (помните, вам нужно место не более FF (2 символа) + 1 для завершения '\0').Это неопределенное поведение.Исправьте это (char x[3];), и все будет в порядке.Вот это mcve :

#include <iostream>
#include <cstdint>
#include <cstdio>
using namespace std;
void hexD(uint8_t state[4][4])
{
char x[3];
for(int i = 0; i < 4; i++)
{
    cout << "\n";
    for(int  j = 0; j < 4; j++)
    {
        cout << j <<"\n"; //displays the value of j
        sprintf(x, "%x", state[i][j]);
        cout << x << "\t";
    }
}
}
uint8_t state[4][4]={
    255,255,255,255,
    0, 1, 2, 3,
    0, 1, 2, 3,
    0, 1, 2, 3,
};
int main()
{
    hexD(state);
}
0 голосов
/ 24 мая 2018
char x[2];

У вас есть только два байта для вашего "шестнадцатеричного вывода", но нет свободного места для символа null.

Запись большего числа в массив с меньшей емкостью составляет неопределенное поведение .

Увеличение размера массива x до 3:

char x[3];

, поскольку согласно sprintf:

ЗавершениеНулевой символ автоматически добавляется после содержимого.

Таким образом, у вас есть в общей сложности три символа , включая null символ.

0 голосов
/ 24 мая 2018

Ваш x имеет только два пробела, но вы пишете в него больше символов.Например, 0 в шестнадцатеричном формате - это "00", два символа плюс закрывающий '\0'.
, который перезаписывает соседнюю память, и ваш j оказывается там и перезаписывается.

Увеличьте размер x[], и оно должно работать.

...