From eebf581c6d6d00714be954fab85f8537fa74b956 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 15 Dec 2024 20:41:42 +0300 Subject: [PATCH] task1 --- CMakeLists.txt | 6 ++++ main.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bb00835 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.28) +project(task1) + +set(CMAKE_CXX_STANDARD 17) + +add_executable(task1 main.cpp) diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..b31def0 --- /dev/null +++ b/main.cpp @@ -0,0 +1,88 @@ +#include +#include +#include +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() { + // Тестирование функции 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; +} \ No newline at end of file