Arlleex 173 1 июня, 2022 Опубликовано 1 июня, 2022 · Жалоба 45 минут назад, jcxz сказал: Всё ещё проще... Тогда уж сразу SendToSomething("0xAA"); и "заданию" оно не противоречит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 1 июня, 2022 Опубликовано 1 июня, 2022 · Жалоба 6 hours ago, Arlleex said: это, конечно, мощно. P.S. Не за что, пользуйтесь и не мучайте свои микроконтроллеры Hide contents static const u8 HexDigTbl[] = "0123456789ABCDEF"; static inline void intToHex2(u32 i, u8 dst[]) { dst[0] = HexDigTbl[i >> 4 & 0xF]; dst[1] = HexDigTbl[i & 0xF]; } а если завтра нужно отправить AAAA? будете писать новую функцию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 1 июня, 2022 Опубликовано 1 июня, 2022 · Жалоба Например: char *u2hex(uint32_t val){ char *bufptr = strbuf; *bufptr++ = '0'; *bufptr++ = 'x'; uint8_t *ptr = (uint8_t*)&val + 3; int i, j; IWDG->KR = IWDG_REFRESH; for(i = 0; i < 4; ++i, --ptr){ for(j = 1; j > -1; --j){ register uint8_t half = (*ptr >> (4*j)) & 0x0f; if(half < 10) *bufptr++ = half + '0'; else *bufptr++ = half - 10 + 'a'; } } *bufptr = 0; return strbuf; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 1 июня, 2022 Опубликовано 1 июня, 2022 · Жалоба 27 минут назад, Arlleex сказал: и "заданию" оно не противоречит Смотря как трактовать термин "hex значение АА". Я понял "hex значение" == число. А у вас - строка. Да - и ваш вариант заданию противоречит. Прочитайте его внимательнее. Там требуется "2хекс символа", а у Вас = 4. 13 минут назад, jenya7 сказал: а если завтра нужно отправить AAAA? будете писать новую функцию? Если немного подумаете, то поймёте, что мой вариант прекрасно будет работать и с AAAA. И даже с AAAAAAAAAAAAAAAA! А вот Ваш с AAAAAAAAAAAAAAAA работать уже не будет. Будете писать новую функцию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 1 июня, 2022 Опубликовано 1 июня, 2022 · Жалоба 2 hours ago, jenya7 said: а если завтра нужно отправить AAAA? будете писать новую функцию? Делаете два вызова этой ф-ии, а "на послезавтра" готовите морально-волевые к написанию функционала scanf() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 173 1 июня, 2022 Опубликовано 1 июня, 2022 · Жалоба 15 минут назад, k155la3 сказал: Делаете два вызова этой ф-ии, а "на послезавтра" готовите морально-волевые к написанию функционала scanf() Во многих задачах количество нибблов для преобразования известно, поэтому Скрытый текст static inline void intToHex1(u32 i, u8 dst[]) { dst[0] = HexDigTbl[i & 0xF]; } static inline void intToHex2(u32 i, u8 dst[]) { dst[0] = HexDigTbl[i >> 4 & 0xF]; dst[1] = HexDigTbl[i & 0xF]; } static inline void intToHex3(u32 i, u8 dst[]) { dst[0] = HexDigTbl[i >> 8 & 0xF]; dst[1] = HexDigTbl[i >> 4 & 0xF]; dst[2] = HexDigTbl[i & 0xF]; } static inline void intToHex4(u32 i, u8 dst[]) { dst[0] = HexDigTbl[i >> 12 & 0xF]; dst[1] = HexDigTbl[i >> 8 & 0xF]; dst[2] = HexDigTbl[i >> 4 & 0xF]; dst[3] = HexDigTbl[i & 0xF]; } static inline void intToHex8(u32 i, u8 dst[]) { dst[0] = HexDigTbl[i >> 28 & 0xF]; dst[1] = HexDigTbl[i >> 24 & 0xF]; dst[2] = HexDigTbl[i >> 20 & 0xF]; dst[3] = HexDigTbl[i >> 16 & 0xF]; dst[4] = HexDigTbl[i >> 12 & 0xF]; dst[5] = HexDigTbl[i >> 8 & 0xF]; dst[6] = HexDigTbl[i >> 4 & 0xF]; dst[7] = HexDigTbl[i & 0xF]; } (нужное дописать, если требуется) - достаточно, ИМХО. P.S. А трактовать словесную кулебяку Цитата ...hex значение АА отправить строкой? (2 хекс символа)... я могу как угодно - правильно и неправильно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 31 4 июня, 2022 Опубликовано 4 июня, 2022 · Жалоба const HexToIntTabl : array[0..255] of byte=(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); function TForm1.HexToInt(Hex: Char) : byte; begin result := HexToIntTabl[Ord(Hex)]; end; Дале в коде: X1 := (HexToInt(str[1]) shl 4) or HexToInt(str[2]); X2 := HexToInt(str[3]); X3 := (HexToInt(str[4]) shl 4) or HexToInt(str[5]); Я сделал бы так, если длина строки фиксированная. Это на паскале, но легко можно перевести на Си. Более быстрый алгоритм конкретно для этого случая не придумал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 173 4 июня, 2022 Опубликовано 4 июня, 2022 · Жалоба 11 минут назад, ДЕЙЛ сказал: Я сделал бы так, если длина строки фиксированная... Лучше некорректные значения в -1 установить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 31 4 июня, 2022 Опубликовано 4 июня, 2022 · Жалоба 4 minutes ago, Arlleex said: Лучше некорректные значения в -1 установить. в данном случае это ничего не даст. Здесь самое тупое и самое быстрое конвертирование именно из строки "XX" в число 0xXX. Здесь нет проверок опять же из соображений максимального быстродействия. Я этот алгоритм применил в своём терминале. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться