您的位置:华清远见教育科技集团 >> Android资料 >> Android OSCL底层移植  
 
Android OSCL底层移植
分享到:

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

 更多相关文章

·OpenCORE文件解析和组合处理
·Android OpenCORE多媒体引擎
·Android PVPlayer引擎的实现
·Android OpenIPMP服务器搭建
·Android CPM插件机制