97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠見教育科技集團 >> 新聞動態(tài) >> Android資料 >> Android OSCL底層移植  
 
Android OSCL底層移植
分享到:

OSCL在OpenCORE中扮演了舉足輕重的角色,提供了跨平臺特性的支持,要求底層系統(tǒng)能夠提供如動態(tài)內(nèi)容管理、線程、文件I/O、網(wǎng)絡套接字、DNS(Domain Name Services)和時間服務等。

如果希望將OpenCORE向一個新平臺移植,主要工作就是在OSCL層進行的,下面介紹OSCL中涉及的常用的字符編碼格式的轉(zhuǎn)換情況。

Unicode向UTF8轉(zhuǎn)換的算法為:

代碼1-1 Unicode向UTF8轉(zhuǎn)換的過程

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個字節(jié)utf8表示*/
        {
          if (i_cur_output+1< nDestLen)
          {
            strDest[i_cur_output++]=(char)szSrc[i];
          }
          else
          {
            //設置結(jié)束符
            strDest[i_cur_output]='\0';
            return 0; /* ERROR_INSUFFICIENT_BUFFER */
          }
        }
        else if (BYTE_2_REP>szSrc[i]) /* 2個字節(jié)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個字節(jié)代理對表示*/
          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
          {
            //設置結(jié)束符
            strDest[i_cur_output]='\0';
            return 0; /* ERROR_INSUFFICIENT_BUFFER */
          }
        }
        else /* 3個字節(jié)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
          {
            //設置結(jié)束符
            strDest[i_cur_output]='\0';
            return 0; /* ERROR_INSUFFICIENT_BUFFER */
          }
        }
      }
      //設置結(jié)束符
      strDest[i_cur_output]='\0';
      //以字節(jié)為單位返回
      return i_cur_output;
    }

UTF8向Unicode轉(zhuǎn)換的算法為:

代碼1-2 UTF8向Unicode轉(zhuǎn)換的過程

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
          {
            //設置結(jié)束符
            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
          {
            //設置結(jié)束符
            strDest[i_cur_output]=0; /
            return 0; /* ERROR_INSUFFICIENT_BUFFER */
          }
        }
        else /*單個字節(jié)表示*/
        {
          if (i< nSrcLen && i_cur_output+1< nDestLen)
          {
            strDest[i_cur_output++]=(wchar_t)pszSrc[i];
            ++i;
          }
          else
          {
            //設置結(jié)束符
            strDest[i_cur_output]=0;
            return 0; /* ERROR_INSUFFICIENT_BUFFER */
          }
        }
      }
    //設置結(jié)束符
    strDest[i_cur_output]=0;
    return i_cur_output;
    }

 更多相關文章

·OpenCORE文件解析和組合處理
·Android OpenCORE多媒體引擎
·Android PVPlayer引擎的實現(xiàn)
·Android OpenIPMP服務器搭建
·Android CPM插件機制