我正在使用一些名为nutcracker的跨平台的东西进入Windows和Linux之间,长话短说它在支持宽字符串字符方面受到限制。我必须使用下面的代码并替换swprintf正在做的事情,我不知道如何。我对低级字节操作的经验很糟糕。有人可以帮帮我吗?
请记住,我不能发疯并重新编写swprintf,但要获得从pBuffer中的数据正确格式化pwszString的基本功能。这是使用Microsoft vc6.0编译器的c ++,但是通过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;因为胡桃夹子里不存在这种类型。
如果您需要查看更多代码,我可以发布更多内容。
感谢。
答案 0 :(得分:0)
为什么你会在nutcracker / linux build中使用WSTR类型?大多数unix和linux都使用utf-8作为文件系统表示,因此,在非Windows版本中,你使用sprintf和char *。
答案 1 :(得分:0)
有点难以准确理解你在寻找什么,所以我猜对了。
由于标签是“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;
}