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