Преобразование шестнадцатеричного MAC-адреса в массив WCHAR на C / C на устройстве WinCE 6 с помощью wprintf()

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