From e3ba03fc91745e5e2013f8326b1caf430c32daad Mon Sep 17 00:00:00 2001 From: NikolaichukAlV Date: Wed, 15 Jan 2025 18:55:22 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=201.?= =?UTF-8?q?=20=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D1=81=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab04_task1.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 lab04_task1.cpp diff --git a/lab04_task1.cpp b/lab04_task1.cpp new file mode 100644 index 0000000..4c9867f --- /dev/null +++ b/lab04_task1.cpp @@ -0,0 +1,92 @@ +#include +#include +#include +#include // Для setlocale +using namespace std; + +// Вспомогательная функция для преобразования числа от 0 до 15 в шестнадцатеричную цифру +char nibble_to_hex(uint8_t i) { + // Проверка корректности входных данных + assert(0x0 <= i && i <= 0xf); + + // Массив символов для шестнадцатеричных цифр + static const char digits[] = "0123456789abcdef"; + return digits[i]; +} + +// Вспомогательная функция для получения символа бита ('0' или '1') +char bit_digit(uint8_t byte, uint8_t bit) { + return (byte & (0x1 << bit)) ? '1' : '0'; +} + +// Преобразование указателя void* в uint8_t* +const uint8_t* as_bytes(const void* data) { + return reinterpret_cast(data); +} + +// Печать одного байта в шестнадцатеричном виде +void print_in_hex(uint8_t byte) { + // Печать старшего полубайта + cout << nibble_to_hex(byte >> 4); + // Печать младшего полубайта + cout << nibble_to_hex(byte & 0xf); +} + +// Печать блока данных в шестнадцатеричном виде +void print_in_hex(const void* data, size_t size) { + const uint8_t* bytes = as_bytes(data); + for (size_t i = 0; i < size; i++) { + print_in_hex(bytes[i]); + + // Форматирование вывода: пробелы между байтами и перенос строки после 16 байт + if ((i + 1) % 16 == 0) { + cout << '\n'; + } else { + cout << ' '; + } + } +} + +// Печать одного байта в двоичном виде +void print_in_binary(uint8_t byte) { + // Печать всех 8 бит, начиная со старшего + for (int bit = 7; bit >= 0; bit--) { + cout << bit_digit(byte, bit); + } +} + +// Печать блока данных в двоичном виде +void print_in_binary(const void* data, size_t size) { + const uint8_t* bytes = as_bytes(data); + for (size_t i = 0; i < size; i++) { + print_in_binary(bytes[i]); + + // Форматирование вывода: пробелы между байтами и перенос строки после 4 байт + if ((i + 1) % 4 == 0) { + cout << '\n'; + } else { + cout << ' '; + } + } +} + +// Пример использования функций +int main() { + // Устанавливаем локализацию на русский язык + setlocale(LC_ALL, "Russian"); + + // Тестирование функции nibble_to_hex + assert(nibble_to_hex(0x0) == '0'); + assert(nibble_to_hex(0xa) == 'a'); + assert(nibble_to_hex(0xf) == 'f'); + + // Пример использования функций печати + uint32_t test = 0x42; + cout << "Шестнадцатеричный вывод:\n"; + print_in_hex(&test, sizeof(test)); + cout << "\n\nДвоичный вывод:\n"; + print_in_binary(&test, sizeof(test)); + cout << '\n'; + + return 0; +}