//~ 3. Пример: ihex.c. //~ Написать функцию print_array_similarly_to_intel_hex(void* addr, int len) (название условное, естественно), //~ выводящую на экран массив в следующем текстовом формате (все числа выводятся шестнадцатеричными числами в верхнем регистре, по два символа на байт): //~ 1. Первая строка: двоеточие, затем все байты адреса, кроме двух младших; //~ 2. Каждая следующая строка содержит данные, разложенные по полям: //~ 1. Двоеточие (`':'`) //~ 2. Первое поле — два байта (младшие два байта тех данных, //~ которые выводятсяв данной строке — для первой строки данных это будут просто два младших байта переменной `addr`, //~ для каждой следующей строки прибавляем к предыдущему адресу число байтов данных, записанных в предыдущей строке). //~ 3. Второе поле — число 00 //~ 4. Третье поле — данные (не более 16 байтов, подряд) //~ 5. Четвёртое поле — один байт, считающийся как сумма всех предыдущих байтов в строке (с переполнением, разумеется). #include #include uint32_t array[100]; void print_array_similar_to_intel_hex(void* addr, int len) { int i=0; uint8_t checksum = 0; printf(":%04X\n", ((uint64_t)addr >> 16) &0xFFFF ); for( i = 0; i < len; ) // Здесь я не инкрементирую i, так как удобнее делать проверку внутри тела, но после инкрементирования { if( i % 16 == 0) // т.к. пишем не более 16 байтов на строку по условию, i%16 - признак начала строки { printf( ":%04X00", (uint64_t)addr & 0xFFFF ); checksum = ((uint64_t)addr & 0xFF) + ( ((uint64_t)addr >> 8) & 0xFF); } printf("%02X", *(uint8_t*)addr); checksum += *(uint8_t*)addr; addr++; i++; /// А вот тут увеличиваем i и смотрим, не закончилась ли строка if( i % 16 == 0 || i == len) // т.к. пишем не более 16 байтов на строку по условию, i%16 - признак конца строки, либо - если завершили всю записб { printf( "%02X\n", checksum ); } } } int main() { array[0] = 0x12345678; array[1] = 0xABCDEF12; print_array_similar_to_intel_hex(array, 100); return 0; }