Нужна помощь в замене swprintf - PullRequest
0 голосов
/ 20 августа 2010

Я использую некоторые кроссплатформенные вещи, называемые «Щелкунчик», для перехода между Windows и Linux, чтобы вкратце сказать, что он ограничен в поддержке широких строковых символов.Я должен взять код ниже и заменить то, что делает swprintf, и я понятия не имею, как.Мой опыт с манипуляцией байтами низкого уровня - отстой.Может кто-нибудь, пожалуйста, помогите мне с этим?

Пожалуйста, имейте в виду, что я не могу сойти с ума и переписать swprintf, но получить базовую функциональность для правильного форматирования pwszString из данных в pBuffer.Это c ++ с использованием компилятора Microsoft vc6.0, но через CXX, поэтому он также ограничен.

wszSep - это просто разделитель, "" или "-" для читабельности при печати. ​​

HRESULT BufferHelper::Buff2StrASCII( 
   /*[in]*/ const unsigned char * pBuffer, 
   /*[in]*/ int iSize,
   /*[in]*/ LPWSTR wszSep,
   /*[out]*/ LPWSTR* pwszString )
{
 // Check args
 if (! pwszString) return E_POINTER;

 // Allocate memory
 int iSep = (int)wcslen(wszSep);
 *pwszString = new WCHAR [ (((iSize * ( 2 + iSep )) + 1 ) - iSep ) ];
 if (! pwszString) return E_OUTOFMEMORY;

 // Loop
 int i = 0;
 for (i=0; i< iSize; i++)
 {
  swprintf( (*pwszString)+(i*(2+iSep)), L"%02X%s", pBuffer[i],  (i!=(iSize-1)) ? wszSep : L"" );
 }
 return S_OK;
}

Это берет то, что находится в pBuffer и кодирует широкий буфер с помощью ascii.Я использую typedef const unsigned short * LPCWSTR;потому что этот тип не существует в щелкунчике.

Я могу опубликовать больше, если вам нужно больше кода.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 августа 2010

Трудно понять, что именно вы ищете, поэтому я догадался.

Поскольку тэг был «C ++», а не «C», я преобразовал его для работы более «C ++». У меня нет Linux-бокса, чтобы попробовать это, но я думаю, что он, вероятно, скомпилируется.

Ваше описание входных данных звучало как широкие символы UTF-16, поэтому я использовал std :: wstring для входного буфера. Если это не так, замените его на std :: vector беззнаковых символов и соответственно измените оператор форматирования.

#include <string>
#include <vector>
#include <cerrno>
#include <iostream>
#include <iomanip>
#include <sstream>

#if !defined(S_OK)
    #define S_OK 0
    #define E_OUTOFMEMORY ENOMEM
#endif

unsigned Buff2StrASCII( 
                const std::wstring &sIn, 
                const std::wstring &sSep, 
                std::wstring &sOut)
{
    try
    {
        std::wostringstream os;

        for (size_t i=0; i< sIn.size(); i++)
        {
            if (i)
                os << sSep;
            os  << std::setw(4) << std::setfill(L'0') << std::hex
                << static_cast<unsigned>(sIn[i]);
        }
        sOut = os.str();
        return S_OK;
    }
    catch (std::bad_alloc &)
    {
        return E_OUTOFMEMORY;
    }
}


int main(int argc, char *argv[])
{
    wchar_t szIn[] = L"The quick brown fox";
    std::wstring sOut;
    Buff2StrASCII(szIn, L" - ", sOut);
    std::wcout << sOut << std::endl;
    return 0;
}
0 голосов
/ 20 августа 2010

Зачем вам вообще использовать типы WSTR в Nutcracker / Linux? Большинство unixes и linux используют utf-8 для представления своей файловой системы, поэтому в сборках, отличных от Windows, вы используете sprintf и char *'s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...