繁体   English   中英

需要帮助替换swprintf

[英]Need help replacing swprintf

我正在使用一些名为nutcracker的跨平台程序在Windows和Linux之间运行,以说一句长话短说,即它对宽字符串字符的支持有限。 我必须采用下面的代码并替换swprintf在做什么,而我不知道如何做。 我对低级字节操作的经验很糟糕。 有人可以帮我吗?

请记住,我不能发疯并重新编写swprintf,但是获得了从pBuffer中的数据正确格式化pwszString的基本功能。 这是使用Microsoft vc6.0编译器但通过CXX的c ++,因此也受到限制。

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; 因为该类型在胡桃夹子中不存在。

如果您需要查看更多代码,我可以发布更多信息。

谢谢。

为什么在胡桃夹子/ Linux构建中完全使用WSTR类型? 大多数Unix和Linux使用utf-8表示文件系统,因此,在非Windows构建中,您将使用sprintf和char *。

准确地理解您要寻找的内容有点困难,因此我猜到了。

由于标记是“ C ++”而不是“ C”,因此我将其转换为以更“ C ++”的方式工作。 我没有Linux机器可以尝试,但我认为它可能会编译OK。

您对输入数据的描述听起来像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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM