Перейти к содержанию
    

Парсинг хекс строки

45 минут назад, jcxz сказал:

Всё ещё проще...

Тогда уж сразу

SendToSomething("0xAA");

и "заданию" оно не противоречит:prankster2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, Arlleex said:

:biggrin: это, конечно, мощно.

P.S. Не за что, пользуйтесь и не мучайте свои микроконтроллеры:prankster2:

  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? будете писать новую функцию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например:

	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;
	}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, Arlleex сказал:

и "заданию" оно не противоречит:prankster2:

Смотря как трактовать термин "hex значение АА". Я понял "hex значение" == число. А у вас - строка.  :unknw:

 

Да - и ваш вариант заданию противоречит. Прочитайте его внимательнее. Там требуется "2хекс символа", а у Вас = 4.

 

13 минут назад, jenya7 сказал:

а если завтра нужно отправить AAAA? будете писать новую функцию?

Если немного подумаете, то поймёте, что мой вариант прекрасно будет работать и с AAAA. И даже с AAAAAAAAAAAAAAAA!

А вот Ваш с AAAAAAAAAAAAAAAA работать уже не будет.:negative:  Будете писать новую функцию? :sarcastic_hand:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jenya7 said:

а если завтра нужно отправить AAAA? будете писать новую функцию?

Делаете два вызова этой ф-ии, а "на послезавтра" готовите морально-волевые к написанию функционала scanf()  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 хекс символа)...

я могу как угодно - правильно и неправильно:biggrin::wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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]);

Я сделал бы так, если длина строки фиксированная. Это на паскале, но легко можно перевести на Си. Более быстрый алгоритм конкретно для этого случая не придумал. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, ДЕЙЛ сказал:

Я сделал бы так, если длина строки фиксированная...

Лучше некорректные значения в -1 установить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Arlleex said:

Лучше некорректные значения в -1 установить.

в данном случае это ничего не даст. Здесь самое тупое и самое быстрое конвертирование именно из строки "XX" в число 0xXX. Здесь нет проверок опять же из соображений максимального быстродействия. Я этот алгоритм применил в своём терминале.  

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...