OSCL在OpenCORE中扮演了举足轻重的角色,提供了跨平台特性的支持,要求底层系统能够提供如动态内容管理、线程、文件I/O、网络套接字、DNS(Domain Name Services)和时间服务等。
如果希望将OpenCORE向一个新平台移植,主要工作就是在OSCL层进行的,下面介绍OSCL中涉及的常用的字符编码格式的转换情况。
Unicode向UTF8转换的算法为:
代码1-1 Unicode向UTF8转换的过程
OSCL_EXPORT_REF int32 oscl_UnicodeToUTF8(const oscl_wchar *szSrc, int32 nSrcLen, char *strDest, int32 nDestLen)
{
int32 i=0;
int32 i_cur_output=0;
char ch_tmp_byte;
if (nDestLen<=0)
{
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
for (i=0; i< nSrcLen; i++)
{
if (BYTE_1_REP>szSrc[i]) /* 1个字节utf8表示*/
{
if (i_cur_output+1< nDestLen)
{
strDest[i_cur_output++]=(char)szSrc[i];
}
else
{
//设置结束符
strDest[i_cur_output]='\0';
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else if (BYTE_2_REP>szSrc[i]) /* 2个字节utf8表示*/
{
if (i_cur_output+2< nDestLen)
{
strDest[i_cur_output++]=(char)(szSrc[i]>>6 | 0xc0);
strDest[i_cur_output++]=(char)((szSrc[i] & 0x3f) | 0x80);
}
else
{
strDest[i_cur_output]='\0'; /* Terminate string */
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else if (SURROGATE_MAX>szSrc[i] && SURROGATE_MIN< szSrc[i])
{ /* 4个字节代理对表示*/
if (i_cur_output+4< nDestLen)
{
ch_tmp_byte=(char)(((szSrc[i] & 0x3c0)>>6)+1);
strDest[i_cur_output++]=(char)(ch_tmp_byte>>2 | 0xf0);
strDest[i_cur_output++]=(char)(((ch_tmp_byte & 0x03) | 0x80) | (szSrc[i]& 0x3e) >> 2);
}
else
{
//设置结束符
strDest[i_cur_output]='\0';
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else /* 3个字节utf8表示*/
{
if (i_cur_output+3< nDestLen)
{
strDest[i_cur_output++]=(char)(szSrc[i]>>12 | 0xe0);
strDest[i_cur_output++]=(char)(((szSrc[i]>>6) & 0x3f) | 0x80);
strDest[i_cur_output++]=(char)((szSrc[i] & 0x3f) | 0x80);
}
else
{
//设置结束符
strDest[i_cur_output]='\0';
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
}
//设置结束符
strDest[i_cur_output]='\0';
//以字节为单位返回
return i_cur_output;
}
UTF8向Unicode转换的算法为:
代码1-2 UTF8向Unicode转换的过程
OSCL_EXPORT_REF int32 oscl_UTF8ToUnicode(const char *szSrc, int32 nSrcLen, oscl_wchar *strDest, int32 nDestLen)
{
int32 i=0;
int32 i_cur_output=0;
if (nDestLen<=0)
{
// We cannot append terminate 0 at this case.
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
unsigned char *pszSrc=(unsigned char *)szSrc;
while (i< nSrcLen)
{
//处理代理对
if (SIGMASK_3_1 <= pszSrc[i])
{
if (i+2< nSrcLen && i_cur_output+1< nDestLen)
{
strDest[i_cur_output++]=(wchar_t)(((wchar_t)pszSrc[i]<<12) |(((wchar_t)pszSrc[i+1] & 0x3f)<<6) |((wchar_t)pszSrc[i+2] & 0x3f));
i += 3;
}
else
{
//设置结束符
strDest[i_cur_output]=0;
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else if (SIGMASK_2_1 <= pszSrc[i]) /*
{
if (i+1< nSrcLen && i_cur_output+1< nDestLen)
{
strDest[i_cur_output++]=(wchar_t)(((wchar_t)pszSrc[i] & ~0xc0)<<6 |((wchar_t)pszSrc[i+1] & ~0x80));
i+=2;
}
else
{
//设置结束符
strDest[i_cur_output]=0; /
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
else /*单个字节表示*/
{
if (i< nSrcLen && i_cur_output+1< nDestLen)
{
strDest[i_cur_output++]=(wchar_t)pszSrc[i];
++i;
}
else
{
//设置结束符
strDest[i_cur_output]=0;
return 0; /* ERROR_INSUFFICIENT_BUFFER */
}
}
}
//设置结束符
strDest[i_cur_output]=0;
return i_cur_output;
}