diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c634b83 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.26) +project(task1) + +set(CMAKE_CXX_STANDARD 17) +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc") + +add_executable(task1 main.cpp) diff --git a/example_input.txt b/example_input.txt new file mode 100644 index 0000000..4a3b60a --- /dev/null +++ b/example_input.txt @@ -0,0 +1 @@ +0 0 \ No newline at end of file diff --git a/example_output.txt b/example_output.txt new file mode 100644 index 0000000..b7a712f --- /dev/null +++ b/example_output.txt @@ -0,0 +1,4 @@ +Test print_in_hex(uint8_t): 30 +Test print_in_hex(uint32_t): 00 00 00 00 +Test print_in_binary(uint8_t): 00110000 +Test print_in_binary(uint32_t): 00000000 00000000 00000000 00000000 \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..21ea5e6 --- /dev/null +++ b/main.cpp @@ -0,0 +1,94 @@ +#include +#include +#include + +// Функция для преобразования nibble (4 бита) в шестнадцатеричную цифру +char nibble_to_hex(uint8_t i) { + const char digits[] = "0123456789abcdef"; + assert(0x0 <= i && i <= 0xf); + return digits[i]; +} + +// Функция для печати байта в шестнадцатеричной форме +void print_in_hex(uint8_t byte) { + std::cout << nibble_to_hex(byte >> 4) << nibble_to_hex(byte & 0xf); +} + +// Функция для преобразования указателя void* в uint8_t* +const uint8_t* as_bytes(const void* data) { + return reinterpret_cast(data); +} + +// Функция для печати массива байт в шестнадцатеричной форме +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) { + std::cout << '\n'; + } + else { + std::cout << ' '; + } + } +} + +// Функция для преобразования байта в двоичную форму +char bit_digit(uint8_t byte, uint8_t bit) { + if (byte & (0x1 << bit)) { + return '1'; + } + return '0'; +} + +// Функция для печати байта в двоичной форме +void print_in_binary(uint8_t byte) { + for (int bit = 7; bit >= 0; bit--) { + std::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) { + std::cout << '\n'; + } + else { + std::cout << ' '; + } + } +} + +int main() { + uint8_t test_byte; + uint32_t test_u32; + + // Ввод значения test_byte с консоли + std::cin >> std::hex >> test_byte; + + // Ввод значения test_u32 с консоли (ожидаем ввод одного байта) + std::cin >> std::hex >> test_u32; + + std::cout << "Test print_in_hex(uint8_t): "; + print_in_hex(test_byte); + std::cout << '\n'; + + std::cout << "Test print_in_hex(uint32_t): "; + print_in_hex(&test_u32, sizeof(test_u32)); + std::cout << '\n'; + + std::cout << "Test print_in_binary(uint8_t): "; + print_in_binary(test_byte); + std::cout << '\n'; + + std::cout << "Test print_in_binary(uint32_t): "; + print_in_binary(&test_u32, sizeof(test_u32)); + std::cout << '\n'; + + return 0; +} diff --git a/starter.bat b/starter.bat new file mode 100644 index 0000000..4716544 --- /dev/null +++ b/starter.bat @@ -0,0 +1,4 @@ +echo Running the program... +cmake-build-release\task1.exe +echo. +pause