|  |  |  | @ -3,85 +3,65 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include <cstdint> | 
			
		
	
		
			
				
					|  |  |  |  | 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 до 15 в символ шестнадцатеричной системы
 | 
			
		
	
		
			
				
					|  |  |  |  | char to_hex_digit(uint8_t value) { | 
			
		
	
		
			
				
					|  |  |  |  |     assert(value < 16); | 
			
		
	
		
			
				
					|  |  |  |  |     const char hex_chars[] = "0123456789abcdef"; | 
			
		
	
		
			
				
					|  |  |  |  |     return hex_chars[value]; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // Вспомогательная функция для получения символа бита ('0' или '1')
 | 
			
		
	
		
			
				
					|  |  |  |  | char bit_digit(uint8_t byte, uint8_t bit) { | 
			
		
	
		
			
				
					|  |  |  |  |     return (byte & (0x1 << bit)) ? '1' : '0'; | 
			
		
	
		
			
				
					|  |  |  |  | // Возвращает символ, представляющий бит ('0' или '1')
 | 
			
		
	
		
			
				
					|  |  |  |  | char get_bit_char(uint8_t byte, uint8_t pos) { | 
			
		
	
		
			
				
					|  |  |  |  |     return (byte & (1 << pos)) ? '1' : '0'; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // Преобразование указателя void* в uint8_t*
 | 
			
		
	
		
			
				
					|  |  |  |  | const uint8_t* as_bytes(const void* data) { | 
			
		
	
		
			
				
					|  |  |  |  |     return reinterpret_cast<const uint8_t*>(data); | 
			
		
	
		
			
				
					|  |  |  |  | // Преобразует указатель на void в указатель на uint8_t
 | 
			
		
	
		
			
				
					|  |  |  |  | const uint8_t* to_byte_array(const void* ptr) { | 
			
		
	
		
			
				
					|  |  |  |  |     return static_cast<const uint8_t*>(ptr); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // Печать одного байта в шестнадцатеричном виде
 | 
			
		
	
		
			
				
					|  |  |  |  | void print_in_hex(uint8_t byte) { | 
			
		
	
		
			
				
					|  |  |  |  |     // Печать старшего полубайта
 | 
			
		
	
		
			
				
					|  |  |  |  |     cout << nibble_to_hex(byte >> 4); | 
			
		
	
		
			
				
					|  |  |  |  |     // Печать младшего полубайта
 | 
			
		
	
		
			
				
					|  |  |  |  |     cout << nibble_to_hex(byte & 0xf); | 
			
		
	
		
			
				
					|  |  |  |  | // Выводит байт в шестнадцатеричном формате
 | 
			
		
	
		
			
				
					|  |  |  |  | void display_hex_byte(uint8_t byte) { | 
			
		
	
		
			
				
					|  |  |  |  |     cout << to_hex_digit(byte >> 4) << to_hex_digit(byte & 0x0F); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // Печать блока данных в шестнадцатеричном виде
 | 
			
		
	
		
			
				
					|  |  |  |  | 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 display_hex_data(const void* data, size_t length) { | 
			
		
	
		
			
				
					|  |  |  |  |     const uint8_t* bytes = to_byte_array(data); | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t idx = 0; idx < length; ++idx) { | 
			
		
	
		
			
				
					|  |  |  |  |         display_hex_byte(bytes[idx]); | 
			
		
	
		
			
				
					|  |  |  |  |         cout << ((idx + 1) % 16 == 0 ? '\n' : ' '); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // Печать одного байта в двоичном виде
 | 
			
		
	
		
			
				
					|  |  |  |  | void print_in_binary(uint8_t byte) { | 
			
		
	
		
			
				
					|  |  |  |  |     // Печать всех 8 бит, начиная со старшего
 | 
			
		
	
		
			
				
					|  |  |  |  |     for (int bit = 7; bit >= 0; bit--) { | 
			
		
	
		
			
				
					|  |  |  |  |         cout << bit_digit(byte, bit); | 
			
		
	
		
			
				
					|  |  |  |  | // Выводит байт в двоичном формате
 | 
			
		
	
		
			
				
					|  |  |  |  | void display_binary_byte(uint8_t byte) { | 
			
		
	
		
			
				
					|  |  |  |  |     for (int pos = 7; pos >= 0; --pos) { | 
			
		
	
		
			
				
					|  |  |  |  |         cout << get_bit_char(byte, pos); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // Печать блока данных в двоичном виде
 | 
			
		
	
		
			
				
					|  |  |  |  | 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 << ' '; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | // Выводит данные в двоичном формате
 | 
			
		
	
		
			
				
					|  |  |  |  | void display_binary_data(const void* data, size_t length) { | 
			
		
	
		
			
				
					|  |  |  |  |     const uint8_t* bytes = to_byte_array(data); | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t idx = 0; idx < length; ++idx) { | 
			
		
	
		
			
				
					|  |  |  |  |         display_binary_byte(bytes[idx]); | 
			
		
	
		
			
				
					|  |  |  |  |         cout << ((idx + 1) % 4 == 0 ? '\n' : ' '); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // Пример использования функций
 | 
			
		
	
		
			
				
					|  |  |  |  | int main() { | 
			
		
	
		
			
				
					|  |  |  |  |     // Тестирование функции nibble_to_hex
 | 
			
		
	
		
			
				
					|  |  |  |  |     assert(nibble_to_hex(0x0) == '0'); | 
			
		
	
		
			
				
					|  |  |  |  |     assert(nibble_to_hex(0xa) == 'a'); | 
			
		
	
		
			
				
					|  |  |  |  |     assert(nibble_to_hex(0xf) == 'f'); | 
			
		
	
		
			
				
					|  |  |  |  |     assert(to_hex_digit(0x0) == '0'); | 
			
		
	
		
			
				
					|  |  |  |  |     assert(to_hex_digit(0xA) == 'a'); | 
			
		
	
		
			
				
					|  |  |  |  |     assert(to_hex_digit(0xF) == 'f'); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     uint32_t sample = 0x42; | 
			
		
	
		
			
				
					|  |  |  |  |     cout << "Hexadecimal representation:\n"; | 
			
		
	
		
			
				
					|  |  |  |  |     display_hex_data(&sample, sizeof(sample)); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // Пример использования функций печати
 | 
			
		
	
		
			
				
					|  |  |  |  |     uint32_t test = 0x42; | 
			
		
	
		
			
				
					|  |  |  |  |     cout << "Шестнадцатеричный вывод:\n"; | 
			
		
	
		
			
				
					|  |  |  |  |     print_in_hex(&test, sizeof(test)); | 
			
		
	
		
			
				
					|  |  |  |  |     cout << "\n\nДвоичный вывод:\n"; | 
			
		
	
		
			
				
					|  |  |  |  |     print_in_binary(&test, sizeof(test)); | 
			
		
	
		
			
				
					|  |  |  |  |     cout << "\n\nBinary representation:\n"; | 
			
		
	
		
			
				
					|  |  |  |  |     display_binary_data(&sample, sizeof(sample)); | 
			
		
	
		
			
				
					|  |  |  |  |     cout << '\n'; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return 0; | 
			
		
	
	
		
			
				
					|  |  |  | 
 |