для цикла — C ++ странное поведение с Cout?

ХОРОШО. Итак, у меня есть этот код, который я написал, и все, что он делает, это печатает 16 шестнадцатеричных значений, а затем печатает 16 символов, а затем печатает новую строку для следующей строки. В цикле for я заметил, что я должен был сделать это определенным способом, чтобы заставить его печатать что-нибудь выше 127, почему я не знаю, поэтому я здесь и спрашиваю вас.

Кроме того, у кого-нибудь есть указания по использованию cout с hex? потому что я должен был импортировать дополнительный модуль, чтобы установить ширину cout на 2.

Этот код был сделан только для практики, я хотел, чтобы вывод выглядел так, как это происходит в шестнадцатеричном редакторе HxD. Я думаю, что я могу использовать только одну строку без необходимости дважды копировать одни и те же значения в объявлении строки.

Но да, любые указатели или критика, пожалуйста, не сдерживайтесь.

#include <iostream>
#include <fstream>
#include <string>

#define SIZE 0x830

using namespace std;

int main(int argc, char * argv[])
{

int i, j, k;

ifstream dump(argv[1], ios::binary);

char* buffer = new char[SIZE];

if (dump.is_open())
{
dump.read(buffer, SIZE);
dump.close();
}
else
{
cout << "no success :(\n";
exit(0);
}

std::string my_hex;
std::string my_char;

for (int i = 0; i < SIZE; i++)
{
my_hex += buffer[i];
my_char += buffer[i];
}

for (int j = 0; j <= 2095; j++)  //j is the position we are in the loop, which means that j also equals current character.
{

if ((j % 16 == 0) && (j != 0)) //if j is divisible by 16 and does not equal 0 then enter this if block, otherwise just print my_hex[j]
{

for (k = 0; k <= 15; k++)
{ //handle regular characters

if ((my_char[(j + k) - 16] >= 0) && (my_char[(j + k) - 16] <= 31) || (my_char[(j + k)] == 255))
{ // this checks if the value is lower than 31 or equal to 255, either which can have a '.' printed in its place.
cout << ".";
}
else if ((my_char[(j + k) - 16] >= 32) && (my_char[(j + k) - 16] <= 127))
{ //if value is greater than or equal to 32 or equal to or less than 127 it will print that character, remember to print the correct character. we must go back to the beginning of the string with - 16.
cout << my_char[(j + k) - 16];
}
else
{
cout << my_char[(j + k) - 16];  //prints everything above 127
};

}
cout << "\n";
}
printf("%02x ", (unsigned char) my_hex[j]); //print hexadecimal values of characters
}
dump.close();
return 0;
}

Если вы думаете, что знаете лучший способ, то, пожалуйста, непременно просветите меня 🙂
* Мне пришлось поменять местами кодовую страницу в cmd на 1252 (ANSI), чтобы вывод символов выглядел правильно по сравнению с HxD.

-3

Решение

Я считаю, что ваш код слишком сложен.

char * p_row = &buffer[0];

const unsigned int BYTES_PER_ROW = 16;
unsigned int byte_count = 0;
while (byte_count < size)
{
// Print the offset for the row, in hex
const size_t offset = (size_t)(p_row - &buffer[0]);
std::cout << std::hex << std::fill('0') << std::setw(6)
<< offset;
std::cout << "   ";

// Print hex values for each byte in the row
for (unsigned int i = 0; i < BYTES_PER_ROW; ++i)
{
const unsigned int byte = (uint8_t)(p_row[i]);
std::cout << std::hex << std::fill('0') << std::setw(2)
<< byte;
if (i == 8)
{
std::cout << "  ";
}
}
// Print ASCII values for printable characters or '.'
std::cout << "      ";
for (unsigned int i = 0; i < BYTES_PER_ROW; ++i)
{
char c = p[i];
if (!isprint(c))
{
c = '.';
}
std::cout << c;
}
std::cout << "\n";
p += BYTES_PER_ROW;
byte_count += BYTES_PER_ROW;
}

В приведенном выше коде смещение печатается первым.
Далее строка печатается в двухзначном шестнадцатеричном формате.
Наконец, строка печатается в виде печатаемых символов или «.».

Указатель буфера и количество байтов увеличиваются на количество байтов в строке.

Приведенный выше код не учитывает строки, которые не имеют длину BYTES_PER_ROW. Это легко исправить и оставить в качестве упражнения для ОП. Подсказка: используйте istream::gcount чтобы получить количество байтов, фактически прочитанных из файла.

3

Другие решения

Других решений пока нет …