#c #c #printf #windows-ce #wchar
#c #c #printf #windows-ce #wchar
Вопрос:
В последние дни я искал и читал несколько десятков вопросов по ere, которые звучат похоже на мою проблему, но мне пока не удалось заставить какое-либо решение работать.
Рассмотрим следующий простой сценарий:
Я программирую приложение на C / C для устройства HMI, работающего под управлением Windows CE 6.0. Для работы наших пользовательских источников мы должны использовать VS 05 в качестве среды. Я должен сохранять MAC-адрес и считывать его из файла .ini и время от времени распечатывать его, поэтому мне нужно иметь возможность конвертировать 6-байтовый MAC-адрес из шестнадцатеричного в строку и обратно.
Окружающая среда вынуждает меня использовать WCHAR вместо обычных символов.
MAC-адреса сохраняются в собственных структурах, предоставляемых API bluetooth:
typedef struct bd_addr_t
{
uint8_addr[6];
}bd_addr;
Итак, что я пытался сделать, это записать соответствующие шестнадцатеричные значения в буферный массив wchar следующим образом: (всегда длиной 13, 12 для 6 * 2 цифр в MAC, 1 для ''
разделителя)
void MacToString(bd_addr *address, WCHAR *macString)
{
macString[12] = L'';
for(int i = 5; i >= 0; i--)
{
wprintf(macString i*2, L"X", address->addr[i]);
}
}
Я также пытался получить доступ к строке, используя amp;macString[i 2]
, но, похоже, я ничего не могу получить в строку. Распечатка wprintf(L"X", address->addr[i])
дает мне только правильные фрагменты строк, поэтому что-то в том, как я пытаюсь сохранить массив WCHAR, кажется неправильным.
Как я могу сохранить uint_8s в виде 2-значных шестнадцатеричных значений внутри строки WCHAR?
Комментарии:
1. Есть ли у вас доступ к
std::stringstream
(<sstream>
) иstd::hex
?2. К сожалению, я этого не делаю. Это было бы намного проще и проще, если бы у меня было..
Ответ №1:
В вашем примере вы используете wprintf с целевым буфером, я думаю, вам нужен swprintf. wprintf будет использовать все, что находится в вашей macString в качестве формата, а ваш формат будет параметром, как написано выше.
Комментарии:
1. С этим изменением в моем цикле for теперь это выглядит так:
for(int i = 5; i >= 0; i--) { swprintf(amp;macString[i * 2], L"X", address->adrr[i]); }
Но мой массив WCHAR по-прежнему остается пустым. Что я упускаю из виду? Это также не работает при доступе к массиву с помощьюmacString i * 2
2. Обновление: я должен исправить себя. Теперь у меня есть только последний октет со значением
address->addr[0]
, но не остальные. Я также, похоже, не могу отладить код, потому что VS говорит мне, что у меня нет исходного кода, доступного для части swprintf…
Ответ №2:
Я не подумал о том, как MAC-адреса сохраняются в обратном порядке в структуре, поэтому я заставил его работать, используя следующий код:
void MacToString(bd_addr *address, WCHAR *macString)
{
int strCount = 0;
macString[13] = L'';
for(int i = 5; i >= 0; i--)
{
swprintf(amp;macString[strCount * 2], L"X", address->addr[i]);
strCount ;
}
}