Roland M Smith Ответов: 3

Преобразование шестнадцатеричного кода в символ на языке Си


Я пишу программу на языке Си с использованием Visual Studio 2017.

Я написал функцию, которая преобразует шестнадцатеричную строку в символ. Например, "4B" преобразуется в "K".

Функция работает, но во время компиляции появляется предупреждающее сообщение. Мне интересно, есть ли лучший способ сделать это.

Предупреждающее сообщение:

предупреждение C4477: 'swscanf' : строку формата '%X' На требует аргумент типа 'беззнаковый тип int *', но аргумент имеет тип вариативную 1 'LPTSTR'

Что я уже пробовал:

void of_hex_to_char(LPTSTR as_hex, LPTSTR as_char)
{
	TCHAR sHex[3];

	memset(sHex, 0x00, sizeof(sHex));

	_tcscpy(sHex, as_hex);
	CharUpper(sHex);

	_stscanf(sHex, L"%x", as_char);

	return;
}

Patrice T

В этом коде нет 'swscanf'.

Roland M Smith

_stscanf-это макрос, который преобразуется в swscanf.

3 Ответов

Рейтинг:
27

Rick York

Сообщение об ошибке сообщило вам, в чем именно заключается проблема. Дескриптор формата %x для sscanf ожидает присвоения значения целому числу без знака. Вы передали ему указатель на символьную строку.

Более простым вариантом было бы использовать _tstoul и передать его базе 16. Это даст вам правильное значение в двоичной форме.

* as_char = (TCHAR) _tcstoul( as_hex, NULL, 16 );
Это интерпретирует переданную строку как базовое 16-значное значение (шестнадцатеричное) и присваивает ее местоположению, на которое указывает as_char. Если вы напечатаете его как %c, то увидите его символьное представление.

_tcstoul обладает интересным свойством - вы можете передать ему нулевую базу, и он будет интерпретировать строку на основе префикса. Для шестнадцатеричной строки строка должна начинаться с 0x, и она поддерживает восьмеричные строки, начинающиеся только с 0.

Одна незначительная вещь - as_char может быть передан как PCTSTR, так как он является константой в этой функции.


CPallini

5.

Рейтинг:
1

CPallini

Следующий Стогпредложение (Примечание: в любом случае вы должны использовать явное приведение, чтобы подавить предупреждение "сужение")

TCHAR hex_to_char(LPCTSTR as_hex)
{
	return  (TCHAR)(_tcstoul(as_hex, NULL, 16));
}


Рейтинг:
0

Roland M Smith

Чтобы избежать изменения кода вызова, я пошел с:

void of_hex_to_char(LPTSTR as_hex, LPTSTR as_char)
{
	* as_char = (TCHAR) _tcstoul( as_hex, NULL, 16 );
}