C++におけるビット毎アクセスの実現


私が起業したプロジェクトでは、ネットワーク帯域幅を節約するために、ネットワークでデータを伝送するにはコンパクトなアクセスが必要で、国防、科学研究、宇宙飛行、軍需産業など多くの分野でも同様の需要があります.
コンパクトなアクセスを実現し、1バイトずつアクセスするのではなく、ビットごとにアクセスします.例えば、1バイトでは、8つのbool情報を格納することができ、くだらないことは言わないで、直接コードを共有することができます(注釈:中のコードアルゴリズムは最適化に値します).
//以下、関数定義
   
   
   
   
  1.  
  2.  
  3. /***********************************************************************/ 
  4. /*    : buffer                                         */ 
  5. /*    pBuffer[in]: buffer                                       */ 
  6. /*    nStart[in]:                                           */ 
  7. /*    nEnd[out]:                                        */ 
  8. /*    retByte[out]:                                   */ 
  9. /*    :void                                                           */ 
  10. /***********************************************************************/ 
  11. void ReadOneBit( byte* pBuffer, int nStart, /* out */int& nEnd, /* out */ byte& retByte );  
  12.  
  13. /***********************************************************************/ 
  14. /*    : buffer                         */ 
  15. /*    pBuffer[in]: buffer                                       */ 
  16. /*    nStart[in]:                                           */ 
  17. /*    btLength[in]:                                         */ 
  18. /*    nEnd[out]:                                        */ 
  19. /*    retData[out]: ,                 */ 
  20. /*    :void                                                           */ 
  21. /***********************************************************************/ 
  22. template<typename T>  
  23. void  ReadDataFromBuffer( byte* pBuffer, int nStart, byte btLength, /* out */int& nEnd, /* out */ T& retData );  
  24.  
  25. /***********************************************************************/ 
  26. /*    : buffer                             */ 
  27. /*    pBuffer[in]: buffer                                       */ 
  28. /*    nStart[in]:                                           */ 
  29. /*    nCount[in]:                                         */ 
  30. /*    nEnd[out]:                                        */ 
  31. /*    pRetData[out]:                              */ 
  32. /*    :void                                                           */ 
  33. /***********************************************************************/ 
  34. void ReadStringFromBuffer( byte* pBuffer, int nStart, int nCount, /* out */int& nEnd, /* out */char* pRetData );  
  35.  
  36.  
  37.  
  38. /***********************************************************************/ 
  39. /*    : buffer                                         */ 
  40. /*    pBuffer[in]: buffer                                       */ 
  41. /*    btData[in]:                                       */ 
  42. /*    nStart[in]:                                           */ 
  43. /*    nEnd[out]:                                        */ 
  44. /*    :void                                                           */ 
  45. /***********************************************************************/ 
  46. void WriteOneBit( byte* pBuffer, byte btData, int nStart,  /* out */int& nEnd );  
  47.  
  48. /***********************************************************************/ 
  49. /*    : buffer                           */ 
  50. /*    pBuffer[in]: buffer                                       */ 
  51. /*    tData[in]: ,                    */ 
  52. /*    nStart[in]:                                           */ 
  53. /*    btLength[in]:                                         */ 
  54. /*    nEnd[out]:                                        */ 
  55. /*    :void                                                           */ 
  56. /***********************************************************************/ 
  57. template<typename T>  
  58. void  WriteDataToBuffer( byte* pBuffer, T tData, int nStart, byte btLength, /* out */int& nEnd );  
  59.  
  60. /***********************************************************************/ 
  61. /*    : buffer                             */ 
  62. /*    pBuffer[in]: buffer                                       */ 
  63. /*    pchar[in]:                                    */ 
  64. /*    nStart[in]:                                           */ 
  65. /*    nCount[in]:                                         */ 
  66. /*    nEnd[out]:                                        */ 
  67. /*    :void                                                           */ 
  68. /***********************************************************************/ 
  69. void WtriteStringToBuffer( byte* pBuffer, char* pchar, int nStart,  int nCount, /* out */int& nEnd  );  

//以下は関数実装
   
   
   
   
  1.  
  2.  
  3. void ReadOneBit( byte* pBuffer, int nStart, /* out */int& nEnd, /* out */ byte& retByte )  
  4. {  
  5.     byte btData = pBuffer[nStart/8];  
  6.     btData = btData <
  7.     retByte = btData >> 7;  
  8.     nEnd = nStart+1;  
  9. }  
  10.  
  11. template<typename T>  
  12. void  ReadDataFromBuffer( byte* pBuffer, int nStart, byte btLength, /* out */int& nEnd, /* out */ T& retData )  
  13. {  
  14.     //  
  15.     retData = 0;  
  16.     if ( btLength > sizeof(T)*8 )  
  17.         return ;  
  18.       
  19.     byte btData;  
  20.     T tData;  
  21.     while ( btLength-- )  
  22.     {  
  23.         ReadOneBit(pBuffer, nStart, nStart, btData);  
  24.         tData = btData <
  25.         retData |= tData;  
  26.     }  
  27.       
  28.     nEnd = nStart;  
  29. }  
  30.  
  31. void ReadStringFromBuffer( byte* pBuffer, int nStart, int nCount, /* out */int& nEnd, /* out */char* pRetData )  
  32. {  
  33.     for ( int nIndex=0; nIndex
  34.     {  
  35.         ReadDataFromBuffer(pBuffer, nStart, 8, nStart, pRetData[nIndex]);  
  36.     }  
  37.     nEnd = nStart;  
  38. }  
  39.  
  40.  
  41. void WriteOneBit( byte* pBuffer, byte btData, int nStart,  /* out */int& nEnd )  
  42. {  
  43.     int nSet = nStart / 8;  
  44.     byte c = pBuffer[nSet];  
  45.     switch ( btData )  
  46.     {  
  47.     case 1:  
  48.         c |= ( 1 <
  49.         break;  
  50.     case 0:  
  51.         c &= ( ~(1 <
  52.         break;  
  53.     default:  
  54.         return;  
  55.     }  
  56.     pBuffer [nSet] = c;  
  57.     nEnd = nStart +1;  
  58. }  
  59.  
  60.  
  61.  
  62. template<typename T>  
  63. void  WriteDataToBuffer( byte* pBuffer, T tData, int nStart, byte btLength, /* out */int& nEnd )  
  64. {  
  65. /* //  
  66.     byte btDataLength = sizeof(T);  
  67.     if ( btLength > sizeof(T)*8 )  
  68.         return;  
  69.       
  70.     int nDataStart = 0; // 0,  
  71.     while ( btLength-- )  
  72.     {  
  73.         byte bitData;  
  74.         ReadOneBit((byte*)&tData, nDataStart, nDataStart, bitData);  
  75.         WriteOneBit(pBuffer, bitData, nStart, nStart);  
  76.     }  
  77.       
  78.     nEnd = nStart;  
  79. */ 
  80.  
  81.     // : buffer ,  
  82.  
  83.     //  
  84.     byte btDataLength = sizeof(T);  
  85.  
  86.     //  
  87.     if ( btLength > sizeof(T)*8 )  
  88.         return;  
  89.  
  90.     // byte*  
  91.     byte* ptData = (byte*)&tData;   
  92.  
  93.     //  
  94.     int nSet = btLength / 8;  
  95.     int nRin = btLength % 8;  
  96.       
  97.     //  
  98.     byte bitData;  
  99.     byte byteData;  
  100.     int nTempEnd;  
  101.  
  102.     // rin  
  103.     byteData = ptData[nSet];  
  104.     while ( nRin-- )  
  105.     {  
  106.         ReadOneBit(&byteData, 7-nRin, nTempEnd, bitData);  
  107.         WriteOneBit(pBuffer, bitData, nStart, nStart);  
  108.     }  
  109.  
  110.     // Set  
  111.     while ( nSet )  
  112.     {  
  113.         byteData = ptData[--nSet];  
  114.         // byte  
  115.         int i=0;  
  116.         while ( i!=8 )  
  117.         {  
  118.             ReadOneBit(&byteData, i++, nTempEnd, bitData);  
  119.             WriteOneBit(pBuffer, bitData, nStart, nStart);  
  120.         }  
  121.     }  
  122.     nEnd = nStart;  
  123.  
  124. }  
  125.  
  126.  
  127. void WtriteStringToBuffer( byte* pBuffer, char* pchar, int nStart,  int nCount, /* out */int& nEnd  )  
  128. {  
  129.     for ( int nIndex=0; nIndex
  130.     {  
  131.         WriteDataToBuffer(pBuffer, pchar[nIndex], nStart, 8, nStart);  
  132.     }  
  133.     nEnd = nStart;